import time # time 모듈 임포트
import requests # request 모듈 임포트
import csv # 파이썬에 기본 내장된 csv 모듈을 import
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome('./chromedriver')
driver.implicitly_wait(5)
url = 'https://www.starbucks.co.kr/menu/drink_list.do' #크롤링할페이지
driver.get(url)
links = driver.find_elements_by_css_selector('#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd > ul > li > dl > dt > a')
products = []
for link in links:
products.append(link.get_attribute('prod'))
product_names=[]
product_desc=[]
product_images=[]
for product in products:
driver.get('https://www.starbucks.co.kr/menu/drink_view.do?product_cd='+product)
name = driver.find_elements_by_css_selector('#container > div.content02 > div.product_view_wrap1 > div.product_view_detail > div.myAssignZone > h4')
product_names.append(name[0].text)
desc = driver.find_elements_by_css_selector('#container > div.content02 > div.product_view_wrap1 > div.product_view_detail > div.myAssignZone > p')
print(desc[0].text)
product_desc.append(desc[0].text)
images = driver.find_element_by_css_selector('#product_thum_wrap > ul > li > a')
print(images.get_attribute('data-image'))
product_images.append(images.get_attribute('data-image'))
starbucks = [{
'name' : props[0],
'description' : props[1],
'image' : props[2]
} for props in zip(product_names,product_desc, product_images)] #zip메소드 인덱스가맞다는 보장하에서는 가공이쉬운 딕셔너리
with open('output.csv', 'w') as csvfile:
csvout = csv.DictWriter(csvfile, ['name','description','image'])
csvout.writeheader()
csvout.writerows(starbucks)
sleep은 프로세스 자체를 지정한 시간동안 기다려 주는 역할을 한다.(무조건 지연)
implicity_wait은 뜻 그대로 브라우저에서 사용되는 엔진 자체에서 파싱되는 시간을 기다려 주는 메소드라고 할 수 있다.
즉, 셀레늄에서만 사용하는 특수한 메소드이다.
links = driver.find_elements_by_css_selector('#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd > ul > li > dl > dt > a')
원래 copy>css selcetor하면
#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd:nth-child(2) > ul 인데
dd:nth-child(2)를 dd까지 지우고 하위 카테고리인 a까지 다 처리해서 페이지 전체 상품을 다 대상으로 해버림.
link.get_attribute('prod')
요소 속성중 prod에 해당하는 속성 값을 추출
find_element_by_css_selector(query)
css 선택자로 요소를 하나 추출
name = driver.find_elements_by_css_selector('#container > div.content02 > div.product_view_wrap1 > div.product_view_detail > div.myAssignZone > h4')
네임부분의 copy> css selector 을 css선택자로 추출
product_names.append(name[0].text)
그럼 for 반복문으로 상품하나하나를 반복하며 크롤링하게 되는데 이때 한 상품당 지니고 있는 이름, 이미지, 설명은 하나뿐이고, 리스트에서 첫번쨰요소를 부르는 개념이기 떄문에 인덱스 0을 product_names에 추가한다.
starbucks = [{'name' : props[0],'description' : props[1],
'image' : props[2] } for props in zip(product_names,product_desc, product_images)]
#zip메소드 인덱스가맞다는 보장하에서는 가공이쉬운 딕셔너리로 나타냄.
csv 파일 읽기/쓰기
with open('output.csv', 'w') as csvfile:
csvout = csv.DictWriter(csvfile, ['name','description','image'])
csvout.writeheader()
csvout.writerows(starbucks)