Crawling

네이버 쇼핑 크롤링2_평점, 댓글수,

km1n 2022. 1. 5. 10:13
#Step 0. 필요한 모듈과 라이브러리를 로딩합니다.
import sys # 시스템
import os  # 시스템

import pandas as pd  # 판다스 : 데이터분석 라이브러리
import numpy as np   # 넘파이 : 숫자, 행렬 데이터 라이브러리

from bs4 import BeautifulSoup    # html 데이터를 전처리
from selenium import webdriver   # 웹 브라우저 자동화
from selenium.webdriver.common.keys import Keys
import chromedriver_autoinstaller

import time    # 서버와 통신할 때 중간중간 시간 지연. 보통은 1초
from tqdm import tqdm
from tqdm import tqdm_notebook   # for문 돌릴 때 진행상황을 %게이지로 알려준다.

# 워닝 무시
import warnings
warnings.filterwarnings('ignore')
query_txt = input('1.크롤링할 키워드는 무엇입니까?: ')
query_txt
chrome_path = chromedriver_autoinstaller.install()
driver = webdriver.Chrome(chrome_path)

# 사이트 주소는 네이버쇼핑
driver.get('https://search.shopping.naver.com/search/all?query={}&cat_id=&frm=NVSHATC'.format(query_txt))
time.sleep(2)  # 2초간 정지
driver.find_element_by_link_text("리뷰 많은순").click()
# 스크롤 다운
def scroll_down(driver):
    driver.execute_script("window.scrollTo(0, 19431049)")
    time.sleep(1)

# n: 스크롤할 횟수 설정
n = 1
i = 0
while i < n: # 이 조건이 만족되는 동안 반복 실행
    scroll_down(driver) # 스크롤 다운
    i = i+1
# url 리스트 만들기
things = driver.find_elements_by_css_selector(".basicList_link__1MaTN")

url_list = []
for thing in things:
    url = thing.get_attribute('href')
    url_list.append(url)
# 제목 리스트 만들기
title_list = []
for thing in things:
    title = thing.text
    title_list.append(title)
import re

# 카테고리 리스트 만들기
things2 = driver.find_elements_by_class_name("basicList_depth__2QIie")
regex = '출산/육아신생아의류(.+)'

category_list = []
for thing in things2:
    category = thing.text
    m = re.match(regex, category)
    category_list.append(m.group(1))
things2 = driver.find_elements_by_class_name("basicList_depth__2QIie")

category_list = []
for thing in things2:
    category = thing.text
    category_list.append(category)
category_list
import re
regex = '출산/육아신생아의류(.+)'

m = re.match(regex, category_list[0]
m.group(1)
print(len(url_list))
url_list
df = pd.DataFrame({"url":url_list, "title":title_list, "category":category_list})
df
df.to_csv("네이버쇼핑_url.csv", encoding = 'utf-8-sig')
df.to_excel("네이버쇼핑_url.xlsx", encoding = 'utf-8-sig')

 


df = pd.read_csv('네이버쇼핑_url.csv')
df['url']
dict = {}

n = 40

for i in tqdm(range(0, n)):
    try:
        driver = webdriver.Chrome(chrome_path)
        driver.get(df['url'][i])
        time.sleep(3)
        
        # 상품명 가져오기
        title = driver.find_element_by_css_selector('._3oDjSvLwq9._copyable')
        title = title.text
        
        # 리뷰 영역으로 이동
        driver.find_element_by_css_selector('._2pgHN-ntx6').click()
        
        # 사용자 평점 가져오기
        score = driver.find_element_by_css_selector('.TFNhvMOrjC._3uz9pzdFUe .blind')
        score = score.text
        score = score[-4:10]

        # 사용자 리뷰수 가져오기
        review_count = driver.find_element_by_css_selector('.TFNhvMOrjC._1UShjXo5FC .blind')
        review_count = review_count.text
        review_count = int(review_count.replace(',','')[:-1])
        
        # 평점낮은순 정렬
        driver.find_elements_by_css_selector('._1K9yWX-Lpq')[3].click()
        
        # 리뷰 글 수집
        review_list = []

        overlays1 = "._1XNnRviOK8 ._19SE1Dnqkf"  
        reviews = driver.find_elements_by_css_selector(overlays1)

        for review in reviews:    
            review = review.text
            review_list.append(review)

        target_info = {}
        target_info['상품명'] = title
        target_info['평점'] = score
        target_info['리뷰수'] = review_count
        target_info['안 좋은 리뷰'] = review_list
        
        dict[i] = target_info
        
        print(title, '( 댓글 수:', len(review_list),')')
        
        driver.close()
        time.sleep(2)
        
    except:
        driver.close()
        continue

print(len(dict))
dict
import pandas as pd
result_df = pd.DataFrame.from_dict(dict, 'index')
result_df
result_df.to_excel("출산선물_네이버쇼핑1.xlsx", encoding='utf-8-sig')
df = df.rename(columns={'title': '상품명'})
df.head()
result_df.head()
data = pd.merge(df, result_df, on='상품명')
data.head()
data.to_excel("출산선물_네이버쇼핑카테고리1.xlsx", encoding='utf-8-sig')