크롤링

sihwan_e·2020년 5월 25일
1

Django

목록 보기
10/21
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)
profile
Sometimes you gotta run before you can walk.

0개의 댓글