나는야 데이터사이언티스트/PYTHON

[Python]네이버 쇼핑 리뷰 크롤링 하기

우주먼지의하루 2021. 6. 16. 00:02
728x90

일단 크롤링 처음 해봄.

허접한 부분이 많지만 기록용, 그리고 나와 같은 초보가 알기 쉽도록

블로그 포스팅

 

 

 

먼저 내가 크롤링하고 싶은 네이버 쇼핑 페이지는 이것

쇼핑몰 리뷰에 있는 리뷰들을 크롤링하고 싶었다

 


- 필요한 모듈

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from time import sleep
import requests
import re
import pandas as pd
import numpy as np
import os

from selenium.webdriver.common.keys import Keys

 

웹 크롤링하는 모듈은 여러개 있었던것같은데 내가 참고한 페이지에는 BeautifulSoup을 써서 나도 요걸로 썼다.

 

 

- 크롤링하고 싶은 부분 

나는 5점 리뷰는 필요없었고 1~4점까지만 수집하면 됏었다

전체로 크롤링하고 5점빼면 되기도 했지만 5점짜리가 너무 많아서 수집하기 시간이 너무 오래 걸렸음

그래서 그냥 1~4점 따로따로 수집해서 붙였다

name=['SK매직 식기세척기']
category=['별점']

#SK매직 식기세척기 후기
ns_address="https://search.shopping.naver.com/catalog/5405693375?query=SK%EB%A7%A4%EC%A7%81%20%EC%8B%9D%EA%B8%B0%EC%84%B8%EC%B2%99%EA%B8%B0%2012%EC%9D%B8%EC%9A%A9&NaPm=ct%3Dkpmnppnc%7Cci%3De156cc3ce67df7506bcc4855ba0ca3121bcb652b%7Ctr%3Dslsl%7Csn%3D95694%7Chk%3D87a66c81e1083edb5b5fa51a8403cb1f3885c053"
#xpath
shoppingmall_review="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[2]/div/div[2]/ul/li[4]/a/strong"
category1="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[4]/a" #3점
category2="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[5]/a" #2점
category3="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[6]/a" #1점
category4="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[2]/div[2]/ul/li[3]/a" #4점

 

xpath는 리뷰 페이지의 오른쪽 버튼 클릭하면 맨 아래에 검사가 나옴. 그걸 클릭.

 

 

그럼 html이 보이는데 거기서 코드를 위에 올리기만 해도 인터넷 페이지에 어디에 선택되었는지 표시가 된다

그러면 자기가 클릭하고 싶은 곳까지 코드를 열어서 Copy full XPath를 하면 /html/body/div ~~ 요런게 복사가 된다.

 

-chromedriver 다운받기

 

▼아래 

https://blog.naver.com/song_sec/221752226329

 

크롬드라이버(Chrome Driver) 설치/다운로드

텍스트마이닝을 업로드하던 중 사전 진행필요한 절차가 많아 크롬드라이버 설치 및 konlpy등을 먼저 포스팅...

blog.naver.com

header = {'User-Agent': ''}
d = webdriver.Chrome('C:/Users/User/chromedriver.exe') # webdriver = chrome
d.implicitly_wait(3)
d.get(ns_address)
req = requests.get(ns_address,verify=False)
html = req.text 
soup = BeautifulSoup(html, "html.parser")
sleep(2)

#쇼핑몰 리뷰 보기
#d.find_element_by_xpath(shoppingmall_review).click()
#sleep(2)

element=d.find_element_by_xpath(shoppingmall_review)
d.execute_script("arguments[0].click();", element)
sleep(2)

크롬드라이버 다운받고 requests해주면 크롬 열림 ! 처음 볼때 진짜 신기 !

일단 위의 코드 실행시켜주면 네이버 쇼핑 리뷰페이지까지 열림

 

 

- Dataframe 만들어주는 함수

#함수 선언
def add_dataframe(name,category,reviews,stars,cnt):  #데이터 프레임에 저장
    #데이터 프레임생성
    df1=pd.DataFrame(columns=['type','category','review','star'])
    n=1
    if (cnt>0):
        for i in range(0,cnt-1):
            df1.loc[n]=[name,category,reviews[i],stars[i]] #해당 행에 저장
            i+=1
            n+=1
    else:
        df1.loc[n]=[name,category,'null','null']
        n+=1    
    return df1

Dataframe 만들어 주는 함수라 굳이 여기 중간에 안넣고 다른데 넣어도 가능가능

 

- 리뷰 가져오기

# 리뷰 가져오기
d.find_element_by_xpath(category3).click() #스크롤 건드리면 안됨
name_=name[0]
category_=category[0]
reviews=[]
stars=[]
cnt=1   #리뷰index
page=1

리뷰랑 평점 등등 가져오는 리스트 변수 정의해줌

 

 

- 리뷰 데이터 수집하기



while True:
    j=1
    print ("페이지", page ,"\n") 
    sleep(2)
    while True: #한페이지에 20개의 리뷰, 마지막 리뷰에서 error발생
        try:
            star=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li[1]/div[1]/span[1]').text
            stars.append(star)
            review=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p').text
            reviews.append(review)
            if j%2==0: #화면에 2개씩 보이도록 스크롤
                ELEMENT = d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul/li['+str(j)+']/div[2]/div[1]/p')
                d.execute_script("arguments[0].scrollIntoView(true);", ELEMENT)       
            j+=1
            print(cnt, review ,star, "\n")
            cnt+=1 
        except: break
            
    sleep(2)
    
    if page<11:#page10까지 적용
        try: #리뷰의 마지막 페이지에서 error발생
            page +=1
            next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page)+']').click() 
            
        except: break #리뷰의 마지막 페이지에서 process 종료 
            
    else :
        try: #page11부터
            page+=1
            if page%10==0: next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a[11]').click()
            else : next_page=d.find_element_by_xpath('/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/div[3]/a['+str(page%10+2)+']').click()
            
        except: break 
            
df4=add_dataframe(name_,category_,reviews,stars,cnt)
#save()

먼저 평점을 수집할 star에 평점이 있는 xpath 넣어주고

review에 수집할 리뷰 xpath를 넣어준다

 

 

그리고 10페이지가 올라가면 다음을 클릭하고 난 뒤에 11 페이지부터 다시 수집하게 되는데

그 코드를 if else로 나누어서 해줌

 

 

 

아래 깃허브에서 코드 가져와서 아래 깃허브보면 더 잘나와있음 !

 

 

▼참고 깃허브

https://github.com/Jimin980921/Text_mining/blob/master/Project/textmining_project_crawling.ipynb

 

Jimin980921/Text_mining

텍스트마이닝을 이용한 소비자분석 _네이버쇼핑 리뷰크롤링. Contribute to Jimin980921/Text_mining development by creating an account on GitHub.

github.com

 

반응형