이번에는 연습을 위해 책과 조금 다르게 무선 청소기 대신 로봇 청소기로 실습 진행
검색 결과 1페이지 정보 수집 함수
def get_prod_items(prod_items):
prod_data = []
# 수집할 정보가 없을 수도 있으니 try, except문 사용
for prod_item in prod_items:
try: # 상품명 가져오기
title = prod_item.select('p.prod_name > a')[0].text.strip()
except:
title = ''
try: # 스펙 가져오기
spec = prod_item.select('div.spec_list')[0].text.strip()
except:
spec = ''
try: # 가격 정보 가져오기
price = prod_item.select('li.rank_one > p.price_sect > a > strong')[0].text.strip().replace(',','')
except:
price = 0
prod_data.append([title, spec, price])
return prod_data
1페이지 크롤링 테스트
from selenium import webdriver
from bs4 import BeautifulSoup
browser = webdriver.Chrome('c:/webdriver/chromedriver.exe')
url = 'http://search.danawa.com/dsearch.php?k1=로봇청소기&module=goods&act=dispMain'
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')
prod_items = soup.select('div.main_prodlist > ul.product_list > li.prod_item')
# 이렇게만 하면 중간의 광고 같은 탭도 들어옴 그래서 추가 처리
for prod in prod_items:
if prod.select('input'): # 실제 상품들에만 input 태그가 있음
pass
else:
prod_items.remove(prod)
prod_data = get_prod_items(prod_items)
print(len(prod_data))
url 만들기 함수
def get_search_page_url(keyword, page):
return 'http://search.danawa.com/dsearch.php?query={}&volumeType=allvs&page={}&limit=40&sort=saveDESC&list=list&boost=true&addDelivery=N&tab=goods'.format(keyword, page)
여러 페이지에 걸친 상품 정보 수집
from selenium import webdriver
from bs4 import BeautifulSoup
import time
from tqdm import tqdm
browser = webdriver.Chrome('c:/webdriver/chromedriver.exe')
# 암묵적으로 웹 자원 로드를 위해 3초 기다림
browser.implicitly_wait(3)
keyword = '로봇청소기'
total_page = 10
prod_data_total = []
# 진행 정도를 표현하는 tqdm 적용
for page in tqdm(range(1, total_page + 1)):
# 검색 페이지 이동
url = get_search_page_url(keyword, page)
browser.get(url)
# 페이지 로딩 완료까지 5초 할당
time.sleep(5)
# 현재 페이지의 html 정보 가져오기
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')
# 상품 정보 추출
prod_items = soup.select('div.main_prodlist > ul.product_list > li.prod_item')
for prod in prod_items:
if prod.select('div.ad_nvista'): # 광고칸 제거
prod_items.remove(prod)
elif prod.select('input'): # 실제 상품들에만 input 태그가 있음
pass
else:
prod_items.remove(prod)
prod_item_list = get_prod_items(prod_items)
# 추출 데이터 저장
prod_data_total = prod_data_total + prod_item_list
# 결과 확인
prod_data_total[:2]
책에는 광고를 제거하는 부분이 없어서 따로 만들었는데 결과가 맞게 나와줬다.