본문 바로가기

프로그래밍&IT/파이썬

[파이썬] 웹 스크래핑.7 - Selenium 활용. "구글 무비" (동적페이지) 정보 수집

"구글 무비"에서 정보 수집

스크롤내리면 데이터를 가져와서 로딩하는 동적 페이지에서 정보를 수집하는 방식을 확인한다.

 

Selenium 사용 전. requests 사용한 단순 수집 - 현황 & 문제점 파악

첫 화면볼때

import requests
from bs4 import BeautifulSoup

url = "https://play.google.com/store/movies/top"

# 받을 언어
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36" ,
    "Accept-Language": "ko-KR, ko"
}
res = requests.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")

movies = soup.find_all("div", attrs={"class": "ImZGtf mpg5gc"})

with open("movie.html", "w", encoding="utf8") as f:
    f.write(soup.prettify()) # html 문서 정리해서 보임

# 현재 request로는 10개정도만 가져온다.

 

위의 내용을 처리하고, html 파일을 열어보면 실제로 10개정도의 데이터만 받은걸 볼 수 있다.

여기서 보이는 건 글자가 깨져보이지만, html 열어보면 한글이 존재한다.

   셀레니움으로 문제해결   

스크롤될때 데이터를 받아오는 (갱신되는) 동적 페이지를 가져올 때, 셀레니움을 사용해서 받아오기로 한다.

* 스크롤내리고 조금 기다렸다가 (내용이 로딩될 걸로 예상되는 시간) , 다시 스크롤을 내리는 방식으로

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()
url = "https://play.google.com/store/movies/top"

browser.get(url)

# 로직
# 해당 내용이 다 보일때까지
# 자바스크립트 구문을 이용해서 스크롤을 계속 내린다

# 해상도 정보 참조(FHD: 1920 x 1080) 해서 내릴수도.
# browser.execute_script("window.scrollTo(0,1080)")

import time
interval = 2 # 2초 설정. 2초마다 스크롤 내리기 위해

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

#반복 수행
while True:
	# webdriver의 javascript 수행하는 기능을 활용해서
    # 화면 가장 아래로 스크롤 내리기    
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    
    # 페이지 로딩 대기 (time.sleep 이용)
    time.sleep(interval)
    
    # 현재 문서 높이를 가져와서 저장
    curr_height = browser.execute_script("return document.body.scrollHeight")

	# 계속화면을 내리다 더이상 안내려가면 loop 종료
    if curr_height == prev_height:
        break;

    prev_height = curr_height

print("스크롤 완료", prev_height)