일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- adaptive life cycle
- TypeScript
- data analyze
- 크롤링
- 애자일
- DANAWA
- visualizing
- Method
- ECS
- Scrum
- python
- matplotlib
- keras
- 프로젝트
- data
- Agile
- instance
- pandas
- javascript
- 다나와
- 자바스크립트
- analyzing
- tensorflow
- AWS
- Project
- algorithm
- Crawling
- opencv
- angular
- webcrawling
Archives
- Today
- Total
LiJell's 성장기
__14.data.analyzing_Danawa_Crawling (다나와 1편) 본문
반응형
- 다나와 2편 전처리: https://lime-jelly.tistory.com/55
- 다나와 3편 시각화: https://lime-jelly.tistory.com/56
- 다나와 4편 연습: https://lime-jelly.tistory.com/entry/17dataanalyzingDanawaFindMonitor-%EB%8B%A4%EB%82%98%EC%99%80-4%ED%8E%B8
14. Danawa crawling (다나와 크롤링)
- 우리는 무선 청소기가 목표다!
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
import time
from tqdm import tqdm_notebook
import pandas as pd
import numpy as np
14.1. 다나와 검색 페이지 접속
ser = Service('../chromedriver/chromedriver.exe')
driver = webdriver.Chrome(service=ser)
url = 'http://search.danawa.com/dsearch.php?k1=%EB%AC%B4%EC%84%A0%EC%B2%AD%EC%86%8C%EA%B8%B0&module=goods&act=dispMain'
driver.get(url)
14.2. 다나와 검색 웹 페이지에서 상품 정보 가져오기
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 실제 검색 페이지를 보면 검색 내용 + 광고 내용도 들어 있어서 나중에 반복작업을 할 때 제거해야한다.
prod_items = soup.select('div.main_prodlist > ul.product_list > li.prod_item ')
len(prod_items)
prod_items[0].select('a.click_log_product_standard_title_')[0].text
title = prod_items[0].select('p.prod_name > a')[0].text
spec_list = prod_items[0].select('div.spec_list')[0].text.strip()
price = prod_items[0].select('li.rank_one > p.price_sect > a > strong')[0].\
text.strip().replace(',', "")
print(title, spec_list, price, sep = ' ||| ')
'''
LG전자 오브제컬렉션 코드제로 ThinQ A9S AO9571 ||| 핸디/스틱청소기 / 핸디+스틱형 / 무선형 / 흡입+걸레겸용 / 소비전력: 590W / [성능] 흡입력: 210W / 2중터보싸이클론 / 스마트인버터모터 / [배터리] 충전시간: 4시간 / 사용시간(개당): 1시간 / 분리형 (2개) / 리튬이온 / [필터] 분리형배기필터 / 헤파필터 / H13급 / 5단계여과 / [기능] 자동물공급 / 배터리잔량표시 / IoT기능 / 자동먼지비움 / [구성] 바닥 / 물걸레 / 침구 / 솔형 / 틈새 / 올인원타워 / [부가] 색상: 카밍베이지 / 무게: 2.6kg / 크기(가로x세로x깊이): 250x1120x260mm ||| 1057840
'''
14.3. 원하는 정보 분리하기
# try: except: 구문으로 같은 태그내에 들어있는 광고를 제거 할 수 있었다.
prod_data = []
for prod_item in prod_items:
try:
title = prod_item.select('p.prod_name > a')[0].text
except:
title = ""
try:
spec_list = prod_item.select('div.spec_list')[0].text.strip()
except:
spec_list = ""
try:
price = prod_item.select('li.rank_one > p.price_sect > a > strong')[0].\
text.strip().replace(',', "")
except:
price = 0
mylist = [title, spec_list, price]
prod_data.append(mylist)
prod_data[0:5]
'''
[['LG전자 오브제컬렉션 코드제로 ThinQ A9S AO9571',
'핸디/스틱청소기 / 핸디+스틱형 / 무선형 / 흡입+걸레겸용 / 소비전력: 590W / [성능] 흡입력: 210W / 2중터보싸이클론 / 스마트인버터모터 / [배터리] 충전시간: 4시간 / 사용시간(개당): 1시간 / 분리형 (2개) / 리튬이온 / [필터] 분리형배기필터 / 헤파필터 / H13급 / 5단계여과 / [기능] 자동물공급 / 배터리잔량표시 / IoT기능 / 자동먼지비움 / [구성] 바닥 / 물걸레 / 침구 / 솔형 / 틈새 / 올인원타워 / [부가] 색상: 카밍베이지 / 무게: 2.6kg / 크기(가로x세로x깊이): 250x1120x260mm',
'1057840'],
['삼성전자 비스포크 제트 VS20A956A3',
'핸디/스틱청소기 / 핸디+스틱형 / 무선형 / 흡입+걸레겸용 / [성능] 흡입력: 210W / 제트싸이클론 / 디지털인버터모터 / [배터리] 충전시간: 3시간30분 / 사용시간(개당): 1시간 / 분리형 (1개) / 리튬이온 / [필터] 5단계여과 / [기능] 자동물공급 / 디스플레이표시창 / 배터리잔량표시 / 자동먼지비움 / [구성] 바닥 / 솔형 / 틈새 / 연장툴 / 청정스테이션 / [부가] 먼지통용량: 0.5L / 색상: 미스티화이트 / 무게: 2.5kg / 액세서리크래들 / 크기(가로x세로x깊이): 250x930x202mm',
'564850'],
['ZAXhUuZDh7', 'ZAXhUuZDh7623637', '623637'],
['LG전자 코드제로 ThinQ A9S AS9370IKT',
'핸디/스틱청소기 / 핸디+스틱형 / 무선형 / 흡입+걸레겸용 / 소비전력: 590W / [성능] 흡입력: 210W / 2중터보싸이클론 / 스마트인버터모터 / [배터리] 충전시간: 4시간 / 사용시간(개당): 1시간 / 분리형 (1개) / 리튬이온 / [필터] 헤파필터 / H13급 / 5단계여과 / [기능] 자동물공급 / 배터리잔량표시 / IoT기능 / 자동먼지비움 / [구성] 바닥 / 물걸레 / 솔형 / 틈새 / 올인원타워 / [부가] 색상: 아이언그레이+딥그레이 / 무게: 2.6kg / 크기(가로x세로x깊이): 250x1120x260mm',
'793780'],
['샤오미 CLEANFLY 차량용 무선 청소기 4세대 H2 (해외구매)',
'차량용청소기 / 무선 / 흡입력: 16,800Pa / 최대출력: 120W / 헤파필터 / 스테인리스 필터 / 추가노즐: 틈새, 솔브러쉬, 연장호스 / 사용시간: 30분 / 소음: 73.8dB / 충전방식: USB C타입 / 배터리용량: 2,000mAh / 색상: 블랙, 화이트 / 크기: 369x72mm / 무게: 560g',
'60090']]
'''
14.4. 함수화
def get_prod_items(pro_items):
prod_data = []
for prod_item in prod_items:
try:
title = prod_item.select('p.prod_name > a')[0].text
except:
title = ""
try:
spec_list = prod_item.select('div.spec_list')[0].text.strip()
except:
spec_list = ""
try:
price = prod_item.select('li.rank_one > p.price_sect > a > strong')[0].\
text.strip().replace(',', "")
except:
price = 0
mylist = [title, spec_list, price]
prod_data.append(mylist)
return(prod_data)
prod_data = get_prod_items(prod_items)
print(len(prod_data))
14.5. 페이지 넘기기
- 패턴찾기
# # 패턴찾기
# http://search.danawa.com/dsearch.php?k1=%EB%AC%B4%EC%84%A0%EC%B2%AD%EC%86%8C%EA%B8%B0&module=goods&act=dispMain
# http://search.danawa.com/dsearch.php?query=%EB%AC%B4%EC%84%A0%EC%B2%AD%EC%86%8C%EA%B8%B0&originalQuery=%EB%AC%B4%EC%84%A0%EC%B2%AD%EC%86%8C%EA%B8%B0&volumeType=allvs&page=2&limit=40&sort=saveDESC&list=list&boost=true&addDelivery=N&recommendedSort=Y&defaultUICategoryCode=102207&defaultPhysicsCategoryCode=72%7C80%7C81%7C0&defaultVmTab=2606&defaultVaTab=390042&tab=goods
# http://search.danawa.com/dsearch.php?query=%EB%AC%B4%EC%84%A0%EC%B2%AD%EC%86%8C%EA%B8%B0&originalQuery=%EB%AC%B4%EC%84%A0%EC%B2%AD%EC%86%8C%EA%B8%B0&volumeType=allvs&page=3&limit=40&sort=saveDESC&list=list&boost=true&addDelivery=N&recommendedSort=Y&defaultUICategoryCode=102207&defaultPhysicsCategoryCode=72%7C80%7C81%7C0&defaultVmTab=2606&defaultVaTab=390042&tab=goods
- page={ } 부분만 바뀌면 다른 것들은 동일함을 알 수 있다.
- %EB%AC%B4%EC%84%A0%EC%B2%AD%EC%86%8C%EA%B8%B0
- 검색어를 뜻한다
- 따라서 아래와 같이 할 수 있다.
def get_search_page_url(keyword, page):
url = 'http://search.danawa.com/dsearch.php?query={0}&originalQuery={0}&volumeType=allvs&page={1}&limit=40&sort=saveDESC&list=list&boost=true&addDelivery=N&recommendedSort=Y&defaultUICategoryCode=102207&defaultPhysicsCategoryCode=72%7C80%7C81%7C0&defaultVmTab=2606&defaultVaTab=390042&tab=goods'.\
format(keyword, page)
return(url)
url = get_search_page_url('무선청소기','1')
print(url)
'''
http://search.danawa.com/dsearch.php?query=무선청소기&originalQuery=무선청소기&volumeType=allvs&page=1&limit=40&sort=saveDESC&list=list&boost=true&addDelivery=N&recommendedSort=Y&defaultUICategoryCode=102207&defaultPhysicsCategoryCode=72%7C80%7C81%7C0&defaultVmTab=2606&defaultVaTab=390042&tab=goods
'''
14.6. 클롤링 시작
import time
from tqdm import tqdm_notebook
keyword = '무선청소기'
total_page = 10
prod_data_total = []
for page in tqdm_notebook(range(1, total_page+1)):
url = get_search_page_url(keyword, page)
driver.get(url)
time.sleep(5)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
prod_items = soup.select('div#productListArea > div.main_prodlist > ul.product_list > li.prod_item')
prod_item_list = get_prod_items(prod_items)
prod_data_total.append(prod_item_list)
prod_data_total[0]
- 확인결과 리스트가 겹겹히 쌓여있다. 벗겨내자
total = []
for temp in prod_data_total:
total += temp
prod_data_total = total
prod_data_total
14.7. 저장
data = pd.DataFrame(prod_data_total)
data.columns = ['상품명', '스펙 목록', '가격']
data.to_excel('./files/danawa_crawling_result_class.xlsx', index =False)
반응형
'Bigdata > Web Crawling' 카테고리의 다른 글
__16.data.analyzing_Danawa_Visualizing (다나와 3편) (0) | 2022.01.21 |
---|---|
__15.data.analyzing_Danawa_preprocessing(다나와 2편) (0) | 2022.01.21 |
__13.data.analyzing_Starbucks_data_visualizing (스타벅스 3편) (0) | 2022.01.20 |
__12.data.analyzing_Starbucks_data_preprocessing (스타벅스 2편) (0) | 2022.01.20 |
__11.data_analyzing_Starbucks_crawling (스타벅스 1편) (0) | 2022.01.19 |
Comments