[크롤링]동적 데이터 수집

예제) G마켓 50위 까지의 "Best" 상품 데이터(순위, 상품명, 가격, 원산지) 수집


 

실습 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
import pandas as pd
import time
from bs4 import BeautifulSoup as bs
 
url = 'http://corners.gmarket.co.kr/Bestsellers'
driver = wb.Chrome();
driver.get(url);
 
img_btn = driver.find_elements_by_css_selector('img.lazy')
 
#데이터 프레임 작성용 리스트
#순위 | 상품명 | 가격 | 원산지
name = []
price = []
where = []
rank = []
 
#sleep(0.1)로 지연 발생, 웹 로딩 및 오류 방지용
for i in range(50) :
    #웹 로딩시 오류 방지를 위한 선택자 재 수집
    img_btn = driver.find_elements_by_css_selector('img.lazy')
    img_btn[i].click()
    time.sleep(0.1)
    
    #파싱
    soup = bs(driver.page_source,'lxml')
    rank.append(i+1)#순위
    name.append(soup.select_one('#itemcase_basic > div > h1').text) #상품명
    price.append(soup.select_one('#itemcase_basic > div > p > span > strong').text) #가격
    #내부에 원산지 외의 텍스트가 있으므로 전처리요구됨
    buf = soup.select_one('#container > div.item-topinfowrap > div.item-topinfo.item-topinfo--additional > div.box__item-detailinfo.box__item-detailinfo--additional > ul > li.list-item-origin.uxeslide_item > div > div').text 
    where.append(buf.split('\n')[3])
    
    driver.back()
    time.sleep(0.1)
    
#데이터 프레임 작성
item_list = pd.DataFrame({'순위':rank,'제품':name,'가격':price,'원산지':where})
item_list.set_index('순위', inplace=True)
display(item_list)
cs




댓글