LiJell's 성장기

__14.data.analyzing_Danawa_Crawling (다나와 1편) 본문

Bigdata/Web Crawling

__14.data.analyzing_Danawa_Crawling (다나와 1편)

All_is_LiJell 2022. 1. 21. 18:38
반응형
 

__15.data.analyzing_Danawa_preprocessing(다나와 2편)

다나와 1편 크롤링: https://lime-jelly.tistory.com/54 다나와 3편 시각화: https://lime-jelly.tistory.com/56 __14.data.analyzing_Danawa_Crawling (다나와 1편) 다나와 2편 전처리: https://lime-jelly.tisto..

lime-jelly.tistory.com

 

__16.data.analyzing_Danawa_Visualizing (다나와 3편)

다나와 1편 크롤링: https://lime-jelly.tistory.com/54 다나와 2편 전처리: https://lime-jelly.tistory.com/55 16. 다나와 데이터 시각화 __14.data.analyzing_Danawa_Crawling (다나와 1편) 다나와 2편 전처리:..

lime-jelly.tistory.com

 

__17.data.analyzing_Danawa_Find_Monitor (다나와 4편)

다나와 1편 크롤링: https://lime-jelly.tistory.com/54 다나와 2편 전처리: https://lime-jelly.tistory.com/55 다나와 3편 시각화: https://lime-jelly.tistory.com/56 __14.data.analyzing_Danawa_Crawling (다..

lime-jelly.tistory.com

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)
반응형
Comments