끄적거림

[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 5(feat. selenium) 본문

Python/Crawling

[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 5(feat. selenium)

Signing 2021. 2. 5. 11:04
728x90
반응형

[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 1(feat. selenium)

[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 2(feat. selenium)

[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 3(feat. selenium)

[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 4(feat. selenium)

[리뷰 크롤링] PlayStore 댓글 크롤링하기 in python 5(feat. selenium)

 


 

예전에 포스팅했던 글들인데, 많은 사람들이 찾게되면서 여러가지 문의를 남기셨다.

그중에서 가장 많은 문의를 받은 것이 총 자동화된 코드를 알고싶으시다는 요청이어서 이렇게 간단하게나마 글을 끄적여본다.

일단 내 블로그를 보면 대체로 글들이 분할되어 포스팅된다.

코드들도 분산되어 있는 것을 볼 수 있는데, 왜 그렇게 하냐면 단순 복붙으로 넘어가지 않았으면 해서였다.

물론 바쁜 분들이나 기초 개발지식이 부족하신 분들에게는 하나하나 읽는 것이 고된 작업일 순 있으나, 각 기능별로 분산된 코드를 이해하고 넘어가면, 후에 비슷한 종류의 문제와 마주했을 때 보다 수월하게 본인이 직접 코딩할 수 있으리란 생각에서였다.

나 역시 코드를 찾을 때 단순 복붙보다는 코드의 의미를 파악하면서 활용하는 쪽으로 해왔기에 이것이 나중에 큰 도움이 된다는 것을 알고있다.

 

하지만, 이미 실력이 있으시거나, 바쁘신 분들을 위해 아래의 full code를 공유하고자 한다.

비록 나도 공부하면서 쌓은 지식들이기 때문에 부족할 수 있으나 많은 분들에게 도움이 되길 바란다.

 

 

# pip install selenium             # cmd ver
# !pip install selenium            # jupyter notebook ver

# 1. Load Module
from selenium import webdriver
from bs4 import BeautifulSoup
import urllib.request as req

import pandas as pd
import numpy as np
import collections as co

import time



# 2. Enter the website page
url = "https://play.google.com/store/apps/details?id=kr.co.zumo.app&showAllReviews=true"
driverPath = "~~~~~/chromedriver.exe"  # chromedriver.exe 파일이 있는 경로
driver = webdriver.Chrome(driverPath)
driver.get(url)




# 3. Scrape Data
SCROLL_PAUSE_TIME = 1.5
last_height = driver.execute_script("return document.body.scrollHeight")
for i in range(5):
    # (1) 4번의  스크롤링
    for i in range(4):
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(SCROLL_PAUSE_TIME)

    # (2) 더보기 클릭
    driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
    
    # (3) 종료 조건
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

## [전체 리뷰] 버튼 클릭하여 펼치기
spread_review = driver.find_elements_by_xpath("//button[@jsaction='click:TiglPc']")
for i in range(len(spread_review)):
    isTrue = spread_review[i].is_displayed()
    print("Element is visible? " + str(isTrue))
    if isTrue:
        spread_review[i].click()
        print(str(i)+"th more button is clicked and wait 1.5 secs...")
        time.sleep(SCROLL_PAUSE_TIME)

reviews = driver.find_elements_by_xpath("//span[contains(@jsname, 'bN97Pc')]")
for i in range(len(reviews)):
    print(str(i) + "\t" + reviews[i].text)

long_reviews = driver.find_elements_by_xpath("//span[@jsname='fbQN7e']")
for i in range(len(reviews)):
    print(long_reviews[i].text)

## merge two list
merged_review = [t.text if t.text!='' else long_reviews[i].text for i,t in enumerate(reviews)]

dates = driver.find_elements_by_xpath("//span[@class='p2TkOb']")
likes = driver.find_elements_by_xpath("//div[@aria-label='이 리뷰가 유용하다는 평가를 받은 횟수입니다.']")
stars = driver.find_elements_by_xpath("//span[@class='nt2C1d']/div[@class='pf5lIe']/div[@role='img']")
stars_text = stars[3].get_attribute('aria-label')




# 4. Merge Data
res_deque = co.deque([])
for i in range(len(reviews)):
    res_deque.append({
        'DATE' : dates[i].text,
        'STAR' : stars[i].get_attribute('aria-label'),
        'LIKE' : likes[i].text,
        'REVIEW' : merged_review[i]
    })

res_df = pd.DataFrame(res_deque)
res_df.to_csv('./Crawling_data.csv', index=False, encoding='utf-8-sig')

 

 

포스팅을 읽어주신 분께서 코드에 대한 피드백을 주셨습니다.

감사합니다 :)

피드백 받은 코드

 

 

 

 

 

728x90
반응형
Comments