본문 바로가기
<p class="coding">

[STEAM 페이지] 웹 스크래핑(Web Scrapping)

by daisy26 2023. 4. 4.

목표 : 웹 스크래핑을 통한 데이터 수집의 자동화

 

<웹 크롤러 vs 웹 스크래퍼>

  • 웹 크롤러 : 웹 페이지의 내부 링크 및 페이지를 따라 인터넷을 체계적으로 탐색하여 콘텐츠를 검색
  • 웹 스크래퍼 : 웹을 포함한 다양한 소스에서 특정 데이터를 추출하는 프로세스

<Web Scrapper for STEAM review data>

import packages

from bs4 import BeautifulSoup as bs
from selenium import webdriver
import time
from tqdm.notebook import trange
import pandas as pd

Data category

#분석하고자 하는 데이터 열(column)을 지정
#리뷰 작성 날짜
Date = []
#리뷰 내용
Content = []
#리뷰 유익성
Helpful = []
#추천 여부
Recommend = []

Scarapper Function

def Scrapping(p_num):
    html = broswer.page_source
    soup = bs(html, 'lxml')

    page = "page"+str(p_num)

    contents = soup.find("div", id=page).find_all("div", {"class" : "apphub_CardTextContent"})
  
    for i in contents:
        temp = str(i).find("</div>")
        p = str(i)[temp+6:-6]
        #------------------없애고 싶은 단어----------
        token = ['\t', '\n', '<br/>', '<b>', '</b>']
        for removeStr in token:
            p = p.replace(removeStr, "")
        Content.append(p)

    dates = soup.find("div", {'id' : page}).find_all("div", {"class" : "date_posted"})

    for i in dates:
        d = str(i).replace('<div class="date_posted">Posted: ', '').replace('</div>', '')
        Date.append(d)

    helpfuls = soup.find("div", {'id': page}).find_all("div", class_="found_helpful")

    for i in helpfuls:
        h = str(i).replace('<div class="found_helpful">', '').lstrip()
        len = h.find(' ')
        Helpful.append(h[:len])

    recommends = soup.find("div", {'id': page}).find_all("div", class_="title")

    for i in recommends:
        r = str(i).replace('<div class="title">', '').replace('</div>', '')
        Recommend.append(r)

Chrome Drive → Load Web page

broswer = webdriver.Chrome("./chromedriver 2")
broswer.maximize_window()
#데이터를 수집하고자 하는 URL
url = "https://steamcommunity.com/app/1811260/reviews/?browsefilter=toprated&snr=1_5_100010_"
broswer.get(url)

Selenium을 활용하여 스크롤 자동화

# 현재 문서 높이를 가져와서 저장
prev_height = broswer.execute_script("return document.body.scrollHeight")
p_num = 0
#-----------스크롤 횟수-------------
final_pnum = 10
#------로딩을 기다리는 시간(초)----
sec = 5 

# 반복 수행
for _ in trange(final_pnum):
# 스크롤 가장 아래로 내림
    broswer.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    p_num = p_num + 1

# 페이지 로딩 대기
    time.sleep(sec)
    Scrapping(p_num)

# 현재 문서 높이를 가져와서 저장
    curr_height = broswer.execute_script("return document.body.scrollHeight")
    if curr_height == prev_height:
        break

    prev_height = curr_height