본문 바로가기
wecode/TIL 정리

위코드 Pre Course - 웹 크롤링

by 왕거 2020. 7. 28.

드디어 유명한 웹 크롤링을 경험했다.

 

웹 크롤링을 할 때에 사용하는 BeautifulSoup, Selenium 라이브러리에 대해서 간단하게 알아보고 실습을 중심으로 진행해봤다.

 

Assignment

1. 빌보드 차트 순위 100 사이트에서 순위, 곡, 아티스트 정보, 앨범 커버를 BeautifulSoup/Selenium을 사용해서 크롤링해보자.

# Assignment 1

from bs4 import BeautifulSoup
from selenium import webdriver # 브라우저를 열수 있는 드라이브모듈
from selenium.webdriver.common.keys import Keys # 키이벤트를 돕는 키 모듈
import requests
import re
import csv
import time

def url_extract(line):
    url_start = line.find('(') + 1
    url_end = line.find(')') - 1

    return line[url_start : url_end]

csv_filename = "billboard_crawl.csv"
csv_open = open(csv_filename, "w+", encoding='utf-8')
csv_writer = csv.writer(csv_open)
csv_writer.writerow( ('rank', 'title', 'singer', 'cover url') )

orig_url = 'https://www.billboard.com/charts/hot-100' # 크롤링 할 사이트

driver = webdriver.Chrome('/usr/bin/chromedriver') # 크롬 브라우저 선택
driver.implicitly_wait(10) # 숫자 크면 잘 읽히는 기붕..
driver.get(orig_url) # 입력한 경로의 정보 긁어볼까요~?
body = driver.find_element_by_css_selector('body') # send_keys()메서드 사용을 위한 body가져오기

for i in range(20): # 11번 ~ 최하단 20번 
    body.send_keys(Keys.PAGE_DOWN) # 페이지 다운 키를  20회 반복한다.
    time.sleep(0.1) # 페이지 로드 대기, 숫자가 크면 안읽히는건 왤까요?


# beautifulsoup 사용 하기 준비
html = driver.page_source # html을 문자열로 가져온다.
driver.close()  # 크롬드라이버 창닫기
dirver.quit()   # 크롬드라이버 종료

bs = BeautifulSoup(html, 'html.parser' )

li_list = bs.find_all('li', {'class': re.compile('chart-list__element')})

for li in li_list:    
    song_rank = li.find_all('span', {'class': re.compile('chart-element__rank__number')})   # 찾아온 <li> 태그의 데이터 중 <span> 태그의 chart-element__rank__number 클래스 데이터를 찾는다.
    song_title = li.find_all('span', {'class': re.compile('chart-element__information__song')})     # 상동, 클래스 이름은 chart-element__information__song
    song_singer = li.find_all('span', {'class': re.compile('chart-element__information__artist')})      # 상동, 클래스 이름은 chart-element__information__artist
    song_cover = li.find_all('span', {'class': re.compile('chart-element__image')})     # 상동, 클래스 이름은 chart-element__image

    rank = song_rank[0].text

    title = song_title[0].text

    singer = song_singer[0].text

    cover = url_extract(str(song_cover))

    csv_writer.writerow( (rank, title, singer, cover) )

csv_open.close()
# 실행 결과 - billboard_crawl.csv

1,Rockstar,DaBaby Featuring Roddy Ricch,"""https://charts-static.billboard.com/img/2017/01/dababy-sfn-155x155.jpg"
2,Come & Go,Juice WRLD x Marshmello,"""https://charts-static.billboard.com/img/2020/07/juice-wrld-t5o-come-and-go-smi-155x155.jpg"
3,Whats Poppin,"Jack Harlow Featuring DaBaby, Tory Lanez & Lil Wayne","""https://charts-static.billboard.com/img/2020/02/jack-harlow-16c-whats-poppin-fly-155x155.jpg"
4,Blinding Lights,The Weeknd,"""https://charts-static.billboard.com/img/2019/12/the-weeknd-nsd-blinding-lights-gfd-155x155.jpg"
5,Wishing Well,Juice WRLD,"""https://charts-static.billboard.com/img/2018/05/juice-wrld-2go-155x155.jpg"
...
#########################################################################################
...
95,Beer Can't Fix,Thomas Rhett Featuring Jon Pardi,"""https://charts-static.billboard.com/img/2019/06/thomas-rhett-2w0-beer-cant-fix-1ze-155x155.jpg"
96,Here And Now,Kenny Chesney,"""https://charts-static.billboard.com/img/2020/02/kenny-chesney-0nz-here-and-now-uwn-155x155.jpg"
97,3 Headed Goat,Lil Durk Featuring Lil Baby & Polo G,"""https://charts-static.billboard.com/img/2013/06/lil-durk-hvd-155x155.jpg"
98,One Beer,HARDY Featuring Lauren Alaina & Devin Dawson,"""https://charts-static.billboard.com/img/2020/01/hardy-000-one-beer-37y-155x155.jpg"
99,44 Bulldog,Pop Smoke,"""https://charts-static.billboard.com/img/2019/08/pop-smoke-5gi-155x155.jpg"
100,Gooba,6ix9ine,"""https://charts-static.billboard.com/img/2020/05/6ix9ine-6ly-gooba-dfc-155x155.jpg"

 

2. 스타벅스 코리아에서 모든 음료의 제목과 이미지 url을 크롤링해서 CSV파일에 저장

# Assignment 2

from selenium import webdriver
from bs4 import BeautifulSoup

import re
import csv

def tag_Clear(arg):     # <dd></dd> 태그 제거 목적용 함수 사용
    return arg[4:(len(arg) - 5)]        # 문자열 슬라이스

csv_filename = "starbucks_crawl.csv"
csv_open = open(csv_filename, "w+", encoding='utf-8')
csv_writer = csv.writer(csv_open)
csv_writer.writerow( ('name', 'img') )

target_url = 'https://www.starbucks.co.kr/menu/drink_list.do'   # 크롤링 할 사이트
driver = webdriver.Chrome('/usr/bin/chromedriver') 

driver.implicitly_wait(5)   # 5초 대기함
driver.get(target_url)      # 페이지 소스 받아오기

html = driver.page_source 

driver.close()
driver.quit()

bs = BeautifulSoup(html, 'html.parser')     # 받아온 HTML 소스 파싱을 위한 BS 객체

menu_full_list = bs.find_all('li', {'class': re.compile('menuDataSet')})    # menuDataSet 클래스명으로 li태그를 전부 찾기

for each_list in menu_full_list:    # 태그 하나하나에 적용한다.
    menu_name = tag_Clear(str(each_list.find('dd')))    # <dd> 태그로 감싸진 메뉴 이름을 찾아서 저장
    # menu_name = each_list.find('dd')
    menu_img_full = each_list.find('img')   # <img> 태그로 감싸진 요소를 저장
    menu_img = menu_img_full.get('src')     # <img> 태그의 'src' 항목을 저장

    csv_writer.writerow( (menu_name, menu_img) )    # 이름과 링크를 한 줄에 저장

csv_open.close()
# 실행 결과 - starbucks_crawl.csv

name,img
나이트로 바닐라 크림,https://image.istarbucks.co.kr/upload/store/skuimg/2019/09/[9200000002487]_20190919181354811.jpg
나이트로 쇼콜라 클라우드,https://image.istarbucks.co.kr/upload/store/skuimg/2018/04/[9200000001275]_20180409150826087.jpg
나이트로 콜드 브루,https://image.istarbucks.co.kr/upload/store/skuimg/2017/03/[9200000000479]_20170328134443491.jpg
돌체 콜드 브루,https://image.istarbucks.co.kr/upload/store/skuimg/2019/04/[9200000002081]_20190409153909754.jpg
바닐라 크림 콜드 브루,https://image.istarbucks.co.kr/upload/store/skuimg/2017/04/[9200000000487]_20170405152830656.jpg
...
####################################################################################
...
퍼플베리 굿 190ML,https://image.istarbucks.co.kr/upload/store/skuimg/2020/06/[9300000002852]_20200616143324367.jpg
한라봉주스 190ML,https://image.istarbucks.co.kr/upload/store/skuimg/2019/06/[5210008055]_20190627152214722.jpg
햇사과 주스 190ML,https://image.istarbucks.co.kr/upload/store/skuimg/2019/12/[9300000002565]_20191205134634839.jpg
블루베리 요거트 190ML,https://image.istarbucks.co.kr/upload/store/skuimg/2019/06/[5210008063]_20190627152600362.jpg
치아씨드 요거트 190ML,https://image.istarbucks.co.kr/upload/store/skuimg/2019/06/[5210008064]_20190627152728521.jpg

 

 

웹 크롤링이란?

  • 영어로는 Web Scraping이라고 부른다.
  • 웹페이지를 통해서 정보를 수집하는 프로그램 또는 작업을 말한다.

크롤링을 진행하려면?

  • 어떤 데이터를 수집할 지에 대한 확실한 정의가 필수요소이다.
  • 브라우저가 제공하는 개발자 도구를 통해서 목표로하는 데이터를 분석해보거나, API를 분석해보는 것이 좋다.
  • Beautifulsoup 또는 Selenium을 사용하면 좀 더 쉽게 진행할 수 있다.

Beautifulsoup와 Selenium

  • 간단하게 세션에서 들은 내용을 정리한다.
  • Beautifulsoup
    • 정적인 웹페이지에 크롤링을 진행할 때에 사용할 수 있다.
    • Selenium에 비하면 가볍다.
  • Selenium
    • 동적은 웹페이지에 크롤링을 진행할 떄에 사용할 수 있다.
    • 브라우저들의 웹 드라이버가 꼭 필요하다.
      • 웹 드라이버가 무거움의 주 원인
      • 하지만 웹 드라이버를 사용함으로서 UI 테스트에도 활용할 수 있다
  • Beautifulsoup와 Selenium은 각각 정리해도 될 정도로 중요한 라이브러리라고 봐야할 듯