"구글 무비"에서 정보 수집
스크롤내리면 데이터를 가져와서 로딩하는 동적 페이지에서 정보를 수집하는 방식을 확인한다.
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개정도의 데이터만 받은걸 볼 수 있다.
셀레니움으로 문제해결
스크롤될때 데이터를 받아오는 (갱신되는) 동적 페이지를 가져올 때, 셀레니움을 사용해서 받아오기로 한다.
* 스크롤내리고 조금 기다렸다가 (내용이 로딩될 걸로 예상되는 시간) , 다시 스크롤을 내리는 방식으로
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)
'프로그래밍&IT > 파이썬' 카테고리의 다른 글
[파이썬] 웹 스크래핑.6 - Selenium 추가 내용 , 메서드, 속성 (0) | 2021.10.26 |
---|---|
[파이썬] 웹 스크래핑.5 - Selenium 기본 (0) | 2021.10.25 |
[파이썬] 웹 스크래핑.4 - CSV 기본 (0) | 2021.10.24 |
[파이썬] 웹 스크래핑.3 - BeautifulSoup4 - 2. find_all [+ http 메소드:get,post] (0) | 2021.10.23 |
[파이썬] 웹 스크래핑.3 - BeautifulSoup4 - 1. 설치 및 기본적인 찾기 (0) | 2021.10.22 |