Skip to content

Latest commit

 

History

History
110 lines (88 loc) · 3.55 KB

211009.md

File metadata and controls

110 lines (88 loc) · 3.55 KB

Day 8

직장인을 위한 데이터분석 with 파이썬 (8일차)

다나와 크롤링

이번에는 연습을 위해 책과 조금 다르게 무선 청소기 대신 로봇 청소기로 실습 진행

검색 결과 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 분석 결과 : http://search.danawa.com/dsearch.php?query={검색어}&volumeType=allvs&page={페이지}&limit=40&sort=saveDESC&list=list&boost=true&addDelivery=N&tab=goods

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]

책에는 광고를 제거하는 부분이 없어서 따로 만들었는데 결과가 맞게 나와줬다.