파이썬(Python)

[ 크롤링-Selenium ] 파이썬 셀레니움 웹페이지 자동 스크롤 하기(Python Selenium scroll webpage)

카루루1007 2022. 10. 18. 17:13
728x90
반응형
SMALL
◆ 웹 페이지 자동 스크롤 하기

웹페이지를 방문하다 보면 보통은 페이지를 클릭해서 

다음 페이지로 넘어가게 되어 있는 곳들이 많습니다.

아래 그림과 같이요.

하지만 네이버 이미지나 구글 이미지 검색 또는 유튜브를 보면

마우스를 스크롤하여 다음 페이지로 넘어갑니다.

이럴경우 충분히 스크롤하여야만 원하는 정보를 최대한 많이 가지고 올 수 있습니다.

 

웹 페이지를 스크롤 하는 코드는 다음과 같습니다.

driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")

또는

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

위 코드를 작성하고 실행하면

현재 웹페이지의 높이를 확인하고

한번에 그 높이만큼 스크롤을 자동으로 해줍니다.

네이버 같은 경우는 두번째 코드로도 잘 작동을 하지만, 

유튜브 같은 경우는 첫번째 코드로 작동이 됩니다.

 

지난번에 했던 것처럼 웹페이지를 불러오고

위 코드를 작성후 실행하면

한페이지가 스크롤 된 후 크롬이 종료되는 것을 보실 수 있습니다.

 

그러면 여러페이지를 스크롤 하는 방법을 알아보겠습니다.

몇번을 스크롤 해야 페이지가 모두 나타나는 지 알 수만 있다면

몇번해라 라고 지정한 후에 반복하면 되겠지만

몇번이나 스크롤 해야 끝나게 되는 지 알 수는 없습니다.

 

◆ 코드의 논리구조

코드의 논리구조는 다음과 같습니다.

먼저 최초로 로드된 웹페이지의 높이를 저장합니다.

그리고 페이지를 스크롤 합니다.

페이지를 스크롤 했을 때 현재 페이지의 높이와

먼저 저장된 페이지의 높이가 같다면 스크롤 할 것이 없다는 의미이므로

스크롤을 종료합니다.

 

만약 페이지가 스크롤이 됐다면,

현재 페이지의 높이가 최초로 불러왔던 웹페이지의 높이보다 높아졌을 것입니다.

그럼 현재 페이지 높이를 다시 저장하고 한번 더 스크롤 합니다.

 

결국 이전 페이지의 높이와 다시 불러온 페이지의 높이가 동일 하다면

더 이상 스크롤 할 것이 없다는 의미이므로 스크롤을 종료합니다.

반응형

 

◆ 소스코드

유튜브를 예로 들겠습니다.

유튜브에 접속 후 검색어로 "파이썬"을 검색해 보겠습니다.

 

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time

service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
url = "https://www.youtube.com/results?search_query=%ED%8C%8C%EC%9D%B4%EC%8D%AC"
driver.get(url)

 

url 에 위 그림의 주소를 복사해서 넣으면 위와 같이 나타납니다.

우선 신경쓰지 않고 넘어가도록 하겠습니다.

 

먼저 페이지가 처음 불러져 왔을 때 페이지의 높이를 확인하는 코드입니다.

last_height = driver.execute_script("return document.documentElement.scrollHeight")
또는
last_height = driver.execute_script("return document.body.scrollHeight")

 

while 문을 사용해서 바로 직전의 페이지 높이와 

스크롤 후 페이지 높이를 확인해서

같을 경우 스크롤을 중단하는 코드입니다.

while True:
    driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")

    
new_height = driver.execute_script("return document.documentElement.scrollHeight;")

    if new_height == last_height:
        break

    last_height =
new_height

 

페이지가 로드되는데 시간이 필요할 수 있으므로 중간에 잠깐의

중단 시간을 설정하겠습니다.

while True:
    driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")

    new_height = driver.execute_script("return document.documentElement.scrollHeight;")

    time.sleep(2)

    if new_height == last_height:
        break

    last_height = new_height

 

이제 해당 코드를 실행하면

검색된 유튜브 페이지가 모두 불러져 올 때까지

계속해서 자동으로 스크롤 되는 것을 보실 수 있습니다.

 

전체코드입니다.

last_height = driver.execute_script("return document.documentElement.scrollHeight")

while True:
    driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")

    new_height = driver.execute_script("return document.documentElement.scrollHeight;")

    time.sleep(2)

    if new_height == last_height:
        break

    last_height = new_height

 

◆ 스크롤 횟수 설정하기

검색어나 환경에 따라 달라질 수 있지만,

저같은 경우는 유튜브에서 파이썬을 검색하고 스크롤을 할 경우

총 32번이 스크롤 되었습니다.

페이지에 따라 더 많을 수 있고 더 적을 수 있습니다.

스크롤이 모두 되기만을 마냥 기다릴 수가 없는 경우도 있으니,

스크롤 되는 횟수를 조정해 보겠습니다.

 

우선 3회 스크롤이 되면 스크롤을 멈추도록 하겠습니다.

last_height = driver.execute_script("return document.documentElement.scrollHeight")

count_scroll = 0

while True:
    driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")

    count_scroll =  count_scroll + 1


    new_height = driver.execute_script("return document.documentElement.scrollHeight;")

    time.sleep(2)

    if new_height == last_height or count_scroll == 3:
        break

    last_height = new_height

 

count_scroll 이라는 변수를 설정하고

한번 스크롤 할 때마다 count_scroll의 변수에 저장되는 값이 1씩 증가합니다.

그리고 count_scroll에 저장된 값이 3이 되면 

while 문을 나오게 됩니다.

728x90
반응형
LIST