이번 포스팅의 목적은 제품 검색을 필터링해서 한 후에 제품 리스트를 크롤링 하는 것이다.
이번 포스팅에서는 다나와의 노트북가격비교 리스트를 이용한다.
prod.danawa.com/list/?cate=112758&15main_11_02
다나와조회
조회 조건
-
노트북 카테고리의 검색에서 제조사 Apple을 선택
- 더보기 버튼을 클릭해서 나오는 제조사 중 하나 선택
-
각 제품명, 사진링크, 가격(1개) 데이터 조회(광고 제품 제외!)
-
5페이지까지 검색 결과만 가져온다.
-
사진링크
페이지 소스 살펴보기
먼저 제조사별 필터링을 걸어야하는데 APPLE는 제조사별 상세검색에서 숨겨져 있다.
APPLE를 보기 위해서는 오른쪽 끝에 '+'를 눌러야된다.
여기서 APPLE는 12번째
- 태그에 위치해 있으며
체크박스를 클릭할 경우
- 태그의 class가 'sub_item normal_item'에서 'sub_item normal_item sub_checked'로 바뀐다.
또한 제품 이미지 링크를 가지고 올 때 주의해야할 것이 있는데
다나와는 처음에 모든제품의 이미지를 가지고오지 않기 때문이다.
스크롤을 내리면 그때 제품의 이미지를 요청하여 가지고 온다.
따라서 처음에는 `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
반응형
'Data Engineering > Crawling' 카테고리의 다른 글
[Crawling] NS SHOP 제품목록 크롤링 (0) | 2020.08.05 |
---|---|
[Crawling] 네이버 영화 평점 및 댓글 크롤링 (3) | 2020.08.05 |
[Crawling] TripAdvisor 댓글 크롤링 (0) | 2020.08.05 |
[Crawling] Headless 브라우저 (0) | 2020.08.05 |
[Crawling] YouTube 동영상 목록 크롤링 (0) | 2020.08.05 |