Data Engineering/Crawling

[Crawling] 다나와(danawa) 제품 리스트 크롤링

YSY^ 2020. 8. 5. 18:52

이번 포스팅의 목적은 제품 검색을 필터링해서 한 후에 제품 리스트를 크롤링 하는 것이다.

이번 포스팅에서는 다나와의 노트북가격비교 리스트를 이용한다.

prod.danawa.com/list/?cate=112758&15main_11_02

 

노트북 가격비교리스트 :: 행복쇼핑의 시작 ! 다나와 (가격비교) - Danawa.com

전체 선택 선택 삭제 상품 비교 관심상품 담기

prod.danawa.com

다나와조회

조회 조건

  • 노트북 카테고리의 검색에서 제조사 Apple을 선택

    • 더보기 버튼을 클릭해서 나오는 제조사 중 하나 선택
  • 각 제품명, 사진링크, 가격(1개) 데이터 조회(광고 제품 제외!)

  • 5페이지까지 검색 결과만 가져온다.

  • 사진링크

 

페이지 소스 살펴보기

먼저 제조사별 필터링을 걸어야하는데 APPLE는 제조사별 상세검색에서 숨겨져 있다.

APPLE를 보기 위해서는 오른쪽 끝에 '+'를 눌러야된다.

처음에는 display:none로 되어있다.
'+'를 누르면 숨겨져 있던 제조사가 노출되고 display가 inline-block로 바뀌어져 있다.

여기서 APPLE는 12번째

  • 태그에 위치해 있으며

체크박스를 클릭할 경우

  • 태그의 class가 'sub_item normal_item'에서 'sub_item normal_item sub_checked'로 바뀐다.

또한 제품 이미지 링크를 가지고 올 때 주의해야할 것이 있는데

다나와는 처음에 모든제품의 이미지를 가지고오지 않기 때문이다.

스크롤을 내리면 그때 제품의 이미지를 요청하여 가지고 온다.

스크롤 내리기 전
스크롤 내린후 -> src링크가 바뀐다.

따라서 처음에는 `img['data-original]`로 조회하고 없으면(Exception) `img[src]`로 크롤링한다.

 

selector

  • 더보기 : dl#dlMaker_simple button.btn_spec_view.btn_view_less

  • Apple : dl#dlMaker_simple > dd > ul:nth-of-type(2) > li:nth-child(12)

  • 제품목록 : li.prod_item.prod_layer

    • 타이틀 : p.prod_name a :text
    • 가격 : p.price_seat a strong :text
    • 링크 : div.thumb_image img : data_original, or , src

 

url = 'http://prod.danawa.com/list/?cate=112758&15main_11_02'

주요기능 import 및 크롬드라이버 실행

import time
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from bs4 import BeautifulSoup

# 브라우저 띄우지 않고 하기
options = ChromeOptions()
options.add_argument('headless')

driver = Chrome()
driver.get(url)

 

제조사 더보기

# 없는것을 만들어야할때.
more_btn = WebDriverWait(driver, 5).until(
            EC.presence_of_element_located([By.CSS_SELECTOR, 'dl#dlMaker_simple button.btn_spec_view.btn_view_more'])
            ).click()

# 제조사 체크박스 클릭
# 있는것을 찾을때 -> 대기가 필요하다면 time.sleep이용
driver.find_element_by_css_selector('dl#dlMaker_simple > dd > ul:nth-of-type(2) > li:nth-child(12)').click()
# element는 하나만 찾고, elements는 여러개 찾음-> a[0]이런식으로 찾아야함

# 검색결과가 렌더링 될때까지 잠시 대기
time.sleep(2)

 

제품정보 크롤링

# 5page
for page in range(1,6):
    print(page)
    soup = BeautifulSoup(driver.page_source)
    product_li_tags = soup.select('li.prod_item.prod_layer')
    print(len(product_li_tags))
    for li in product_li_tags:
        name = li.select_one('p.prod_name a').text.strip()
        price = li.select_one('p.price_sect a strong').text.strip()
        img_link = li.select_one('div.thumb_image img').get('data-original')
        if img_link == None:
            img_link = li.select_one('div.thumb_image img').get('src')
        print(name, price, img_link)

 

#결과

728x90
반응형