개발자식

[크롤링] 무한 스크롤 웹 스크래핑(Selenium) 본문

Data/Python

[크롤링] 무한 스크롤 웹 스크래핑(Selenium)

밍츠 2022. 3. 30. 01:31

인스타그램, 트위터와 같이 무한으로 스크롤을 내릴 수 있는 사이트가 있다.

이는 BeautifulSoup으로 한 번에 가져오지 못하므로,

Selenium을 이용해야 한다.

 


 

이 예제는 돌아가지 않고, 코드 분석 용이다.

 

from webdriver_manager.chrome import ChromeDriverManager # 자동으로 크롬드라이버(가상브라우저) 파일을 다운로드해주는 라이브러리
from selenium.webdriver.chrome.service import Service # 다운로드된 크롬드라이버 파일을 연결하기 위해 활용

from selenium import webdriver
from bs4 import BeautifulSoup

import pandas as pd
import time
import datetime 
from dateutil import rrule

import warnings
warnings.filterwarnings("ignore")

 

service = Service(executable_path=ChromeDriverManager().install()) 
driver = webdriver.Chrome(service=service)

driver.get(url) 
time.sleep(3)

# 아래 코드가 특정 웹페이지에서 Selenium을 활용해 스크롤 다운하는 코드입니다.
# 가장 아래까지 스크롤 다운 후 매번 3초씩 로딩을 기다린 후 스크롤 다운을 마지막까지 진행합니다.
while True:
    lastHeight = driver.execute_script("return document.body.scrollHeight")
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)
    newHeight = driver.execute_script("return document.body.scrollHeight")
    if newHeight == lastHeight:
         break

web = driver.page_source
source = BeautifulSoup(web, 'html.parser')

 

- lastHeight = driver.execute_script("return document.body.scrollHeight") : 마지막 시점의 창 높이를 저장한다.

- driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") : 현재 창 길이만큼 스크롤한다.

- time.sleep(3) : 스크롤 후 창이 로딩되기 위해 3초를 기다린다.

- newHeight = driver.execute_script("return document.body.scrollHeight") : 스크롤이 된 후의 창 높이를 새로운 높이로 저장한다.

- 새로운 높이가 이전 높이와 같으면 스크롤 종료, 아니면 다시 스크롤 반복한다.

 

이러한 무한 반복 같은 경우는 범위를 지정해주는 것이 좋다.

 

Comments