본문 바로가기
문송충의 코딩하기/파이썬 데이터 분석

Amazon Products Reviews 분석 #1 - 데이터 가져오기

by 동장군님 2020. 7. 3.
728x90

아래 갤럭치 워치 액티브에 있는 소비자 리뷰를 우선 크롤링해보겠다

https://www.amazon.com/Samsung-Active2-Silicon-Aluminum-Bluetooth/dp/B07YNTM7P4/ref=cm_cr_arp_d_product_top?ie=UTF8

 

결과물:

ㄴ 리뷰 날짜, 리뷰 별점, 리뷰 타이틀, 리뷰 내용이 포함된 Raw Data

ㄴ 월별 리뷰 평균 별점, 월별 총 리뷰 개수

ㄴ 리뷰 별점 1점~5점 별 리뷰 개수

 

from selenium import webdriver as wd
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
import re
import time
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup as bs
import pandas as pd
import os
from datetime import datetime

# ChromeDriver Option


#함수로 만들기
def dong_amazon_reviews(asin):
    
    #제품 리뷰 raw data를 액셀로 내보내지도록 파일 경로와 이름을 지정해준다.
    #여기서는 ASIN 코드를 파일명으로 지정
    writer =pd.ExcelWriter(f'{asin}.xlsx')
    
    #Webdriver의 옵션을 설정
    options=Options()
    #크롤링 시작될때 프론트에서 크롬창이 뜨지 않고 백단에서 돌릴 수 있도록 하는 옵션
    options.add_argument("--headless")
    #크롬창 사이즈
    options.add_argument("--window-size=1920x1080")
    options.add_argument("disable-gpu")
    # 여기 Path 부분에 Chromedriver.exe가 설치된 경로를 지정
    driver=wd.Chrome(executable_path = 'Path',options=options)

    url=f'https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=recent&pageNumber=1'
    #Driver Get Url
    driver.get(url)
    driver.implicitly_wait(10)
    res=driver.page_source
    obj=bs(res,'html.parser')

    # 총 리뷰수 가져오기
    num_pos_reviews=obj.select('div.a-expander-content.a-expander-partial-collapse-content > div:nth-child(2) > span > a')[0].get_text()
    num_cri_reviews=obj.find('a',{'data-reftag':'cm_cr_arp_d_viewpnt_rgt'}).get_text()
    reviews=int(''.join(re.findall(r'[0-9]',num_pos_reviews)))+int(''.join(re.findall(r'[0-9]',num_cri_reviews)))

    titles=[]
    stars=[]
    dates=[]
    contents=[]

    while True:
        time.sleep(3)
        source=driver.page_source
        bs_obj=bs(source,"html.parser")
        
        #리뷰 타이틀 가져오기
        for i in bs_obj.findAll('a',{'data-hook':'review-title'}):
            titles.append(i.get_text().strip())
        
        #리뷰 날짜 가져오기
        for n in bs_obj.findAll('span',{'data-hook':'review-date'}):
            nn=''.join(n.get_text().split(' ')[-3:])
            date=datetime.strptime(nn, '%B%d,%Y').date()
            dates.append(date)
        
        #리뷰 내용 가져오기
        for a in bs_obj.findAll('span',{'data-hook':'review-body'}):
            contents.append(a.get_text().strip())
        
        #리뷰 평점 가져오기
        for u in bs_obj.findAll('i',{'data-hook':'review-star-rating'}):
            stars.append(int(u.get_text()[0]))
        print('Number of Scraped Reviews: ', len(titles))

        if len(titles) ==reviews:
            break
        
        #다음 리뷰 페이지롤 넘어갈 수 있는 Next Button 클릭
        driver.find_element_by_xpath('//*[@id="cm_cr-pagination_bar"]/ul/li[2]/a').click()
        WebDriverWait(driver, 15).until(
                    # 지정한 한개 요소가 올라면 웨이트 종료
            EC.presence_of_element_located((By.XPATH, '//*[@id="a-autoid-3"]/span/input'))
        )
    driver.close()
    driver.quit()        
    
    df=pd.DataFrame({'Date':dates,'Rating':stars,"Title":titles,"Body":contents})
    
    
    #월 추출
    df['Month']=df['Date'].apply(lambda x:
                                 str(x.year)[2:]+ '0'+ str(x.month) if (len(str(x.month))==1) 
                                 else str(x.year)[2:]+ str(x.month)) 
    
    #월별 평균 평점과 리뷰 개수 구하기
    data_summary=df.groupby('Month')['Rating'].agg(['mean','count'])
    
    #1~5 평점별 개수 구하기
    rating_counts=data.groupby('Rating')['Title'].agg(['count'])
    
    df.to_excel(writer,sheet_name='Raw Data')
    data_summary.to_excel(writer,sheet_name ='월별 평점 요약')
    rating_counts.to_excel(writer,sheet_name ='Data Summary', startcol=6)
    
    writer.save()
    
    return df

#실제로 돌려보자
data=dong_amazon_reviews('B07YNTM7P4')

결과로 아래 Raw 파일이 저장된다.

B07YNTM7P4.xlsx
0.01MB

성의없는 코딩 끝

728x90
반응형

댓글