Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
more
Archives
Today
Total
관리 메뉴

짱이 될거야

2022-09-06: Python 네이버 쇼핑몰 후기 웹 크롤링 1탄 본문

Today I Learned

2022-09-06: Python 네이버 쇼핑몰 후기 웹 크롤링 1탄

jeong57 2022. 9. 6. 17:57

파이썬 언어로 네이버 쇼핑몰 후기를 웹 크롤링 했다.

 

 

GitHub - Jimin980921/Text_mining: 텍스트마이닝을 이용한 소비자분석 _네이버쇼핑 리뷰크롤링

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

github.com

 

네이버 쇼핑몰 리뷰 크롤링

오늘은 네이버 쇼핌몰 리뷰 크롤링을 진행해봤습니다. "LG 에어로타워"에 대한 리뷰가 필요한데, 네이버 쇼핑몰의 리뷰가 수는 적어도 괜찮은 평가들이 있더라구요! 에어로타워 쇼핑몰리뷰를 크

velog.io

 

 

준비단계

먼저, ChormeWebDriver를 다운로드 한다.

1. 크롬 설정 > Chome 정보 탭에 들어가서 현재 버전을 확인한다. (내 버전은 105.0.5195.102)

내 chrome 버전

2. 구글에 Chrome Webdriver를 검색해서 아래 사이트에 들어간다.

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 106, please download ChromeDriver 106.0.5249.21 If you are using Chrome version 105, please download ChromeDriver 105.0.5195.52 If you are using Chrome version 104, please download ChromeDriver 104.0.5112.79

chromedriver.chromium.org

 

3. 내 chrome 버전보다 작은 버전 중 가장 높은 버전의 제목(105.0.5195.52)을 클릭한다.

 

4. window 64를 쓰기 때문에 chromedriver_win32.zip을 선택하고 압축을 푼다.

5. 그러면 chromedriver.exe 파일이 나오는데, 크롤링 코드가 있는 폴더 위치에 chromedriver.exe 파일을 옮겨둔다.

6. 크롤링 코드가 있는 폴더에 빈 csv 파일을 만들어 둔다. 여기에 크롤링으로 받은 데이터를 저장할 것이다.

 

 

크롤링 과정

1. import

: 필요한 라이브러리들을 import한다. BeautifulSoup을 쓸 예정이다.

from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep
import requests
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

2. 데이터 크롤링을 통해 받아오지 않고, 항상 같은 값을 넣을 데이터는 아래와 같이 미리 선언한다.

name=['LG 에어로타워']
category=['별점']

3. 쇼핑몰 주소 설정

  • ns_address: 쇼핑몰 주소
  • shoppingmall_review: 리뷰들 목록(보통 ul)
#LG 에어로타워 후기
ns_address="https://search.shopping.naver.com/catalog/30128278618?cat_id=50002543&frm=NVSCPRO&query=%EC%97%90%EC%96%B4%EB%A1%9C%ED%83%80%EC%9B%8C&NaPm=ct%3Dl0ksn0vc%7Cci%3D5bbd25c0299ce5dbcb72ff2b1d41488ebd6d52ce%7Ctr%3Dsls%7Csn%3D95694%7Chk%3D87194ce8ced4cb2b52968022b8eb9db67602d12e"
#xpath
shoppingmall_review="/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[6]/ul"


header = {'User-Agent': ''}
d = webdriver.Chrome('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)

개발자 도구로 확인한 shoppingmall_review

 

4. 데이터 프레임에 저장

  • csv에 어떤 식으로 넣을 건지를 정해준다.
  • columns는 csv에 보여질 열의 이름이다.
  • df1.loc[n] = ... 코드를 통해 각 행에 데이터들이 저장된다.
  • 이 때, name, category는 변하지 않는 값이므로 초기값을 설정할 때 그대로 name, category를 적고, 나머지들에는 null 값을 넣어준다.
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

 

5. 리뷰 가져오기 준비단계

  • name, category는 기존 선언한 값을 그대로 가져오기 때문에 "name_"과 같이 적는다. 이때, 여기서는 name[0]을 이용하는데 대부분 그냥 name 자체를 이용한다.
  • 리뷰, 평점 같은 경우는 빈 리스트를 만들고, 여기에다가 데이터들을 넣은 후 하나씩 돌려가면서 csv에 넣을 예정이다.
  • csv에 넣는 코드는 4번에 해당한다.
# 리뷰 가져오기
d.find_element_by_xpath(shoppingmall_review).click() #스크롤 건드리면 안됨
name_=name[0]
category_=category[0]
reviews=[]
stars=[]
cnt=1   #리뷰index
page=1

 

6. 크롤링 해서 리뷰 가져오기

1페이지부터 가져오기 시작하는데, 가져오고 싶은 부분을 개발자도구에서 찍고, 우클릭 > Copy > Copy full XPath를 통해 코드를 얻는다.

반복되는 부분은 str[j]로 바꾼다.

기존 코드(1번 코드)에서는 화면에 리뷰가 2개씩 보이도록 스크롤 하는 코드가 있었는데, 네이버 쇼핑몰 후기 크롤링 외에 다른 사이트 데이터를 크롤링 할 때 이 부분에서 계속 에러가 난다.

그런 경우는 2번 코드를 참고하면 화면에 보이는 리뷰 혹은 데이터 개수를 정하지 않아도 자동으로 스크롤 되면서 데이터를 가져온다.

# 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['+str(j)+']/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]').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]')
                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
# 2번 코드(scroll 시 화면에 보여지는 데이터 개수 정하지 않음)
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['+str(j)+']/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]').text
            reviews.append(review)
            
            # 스크롤 내리기
            d.execute_script("window.scrollTo(0, document.body.scrollHeight)")
           	print(cnt, review ,star, "\n")
            
            j+=1
            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

 

7. csv 파일에 저장

csv 파일에 저장할 때는 encoding과 mode를 설정해줘야 한다.

mode="w"는 매번 새로 써서 덮어쓰기가 되고, mode="a"는 이어 쓰기이다.

df4=add_dataframe(name_,category_,reviews,stars,cnt)

df4.to_csv('./data.csv', encoding='utf-8-sig', mode='w')

 

 

결론

파이썬으로 크롤링하는 방법은 구글에 많이 나와있었는데, csv에 저장하는 방법이 자세히 나와있지 않아 어려웠다.

크롤링 코드 전체를 이해하고 처음부터 쓴 게 아니라 다른 사람의 코드를 참고해서 하나씩 고쳐가면서 해본 것이기 때문에 필요없는 코드도 있고 나한테 맞게 바꿔야 하는 부분도 있었다.

하나씩 개발자 도구에 찍어가면서 해보니까 금방 익힐 수 있었고 다른 사이트도 크롤링 해보니까 훨씬 더 빨리 이해할 수 있었다.

 

 

참고:

2022.09.19 - [Today I Learned] - 2022-09-19: Python 네이버 쇼핑몰 후기 웹 크롤링 2탄

Comments