본문 바로가기
셀레니움(selenium)

셀레니움으로 화면 스크롤 내려보자 (with 파이썬)

by 유니네 라이브러리 2024. 5. 4.

셀레니움에서 스크롤 내리는 것은 자바스크립트의 window.scrollTo() 메서드를 이용하면 된다.

※ 자바스크립트 개발문서 참고

 

Window.scrollTo() - Web API | MDN

문서의 지정된 위치로 스크롤합니다.

developer.mozilla.org

driver 객체의 execute_script()를 활용하여 현재 스크롤 위치와 이동해야 할 스크롤 위치를 증가해 가면서 window.scrollTo()를 사용한다.

▶ 이전 셀레니움 execute_script() 관련 글은 여기로 ☜

 

셀레니움에서 클릭하는 법 (with python)

셀레니움에서 요소를 클릭하는 법은 크게 3가지가 있다.driver 객체에서 .click() 사용하는 방법driver 객체에서 send_keys(Keys.ENTER) 사용하는 방법driver 객체의 execute_script() 를 활용하는 방법각각의 사용

yuneenelife.tistory.com

▶ 셀레니움 웹 스크롤 코드 예시 (with 파이썬)

  • window.scrollTo(from height, to height) 활용
  • 스크롤 시작지점과 종료지점을 각각 증가시키면서 화면 이동
  • 페이지 맨 하단으로 이동되면 현재 위치가 더 이상 증가되지 않으므로 종료
def webScroll(i_present_location):
	  print("#####Start Scroll#####")
    time.sleep(1)
    #스크롤 시작지점 초기화
    from_scroll_height = 0
    #스크롤 종료지점 초기화
    to_scroll_height = 500
    last_height = driver.execute_script("return document.body.scrollHeight")    
    
    while True:
        #scroll 진행
        driver.execute_script("window.scrollTo("+ str(from_scroll_height) + "," + str(to_scroll_height) + ")")
        time.sleep(1)
        #현재 스크롤 위치
        present_location = driver.execute_script("return window.pageYOffset")
        #페이지 하단에 위치하면 종료
        if last_height == present_location:
            #하단 메뉴 보이고 나가기
            driver.execute_script("window.scrollTo("+ str(to_scroll_height) + "," + str(from_scroll_height) + ")")
            break
        #현 위치값이 인수로 넘어온 값보다 커지면 종료
        elif present_location > i_present_location:
            driver.execute_script("window.scrollTo("+ str(to_scroll_height) + "," + str(from_scroll_height) + ")")
            break
        else:
            #이동여부 판단 기준이 되는 이전 위치 값 수정
            last_height = driver.execute_script("return window.pageYOffset")
            #하단 위치 +500 씩 이동
            from_scroll_height = to_scroll_height + 1
            to_scroll_height = to_scroll_height + 500
print("#####End Scroll#####")
#스크롤 함수 호출 : 함수에 넘기는 인수는 무한스크롤에 대처하기 위해 현 스크롤 위치가 인수값을 넘기면 종료시키기 위해 전달
webScroll(30000)

 

▶ 아래는 네이버 쇼핑 메인화면을 스크롤하는 풀 코드 예시이다.

  • 크롬 브라우저 옵션은 시크릿모드로 아이폰 모바일 에뮬레이터 환경 설정
  • 인피니티 스크롤 대비하는 페이지 하단 위치값 조정하여 종료 코드 추가
  • 네이버 쇼핑 메인의 기본 레이어 팝업 닫기 클릭 코드 추가
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# 시나리오
# 1. 지정한 URL 기준 하단까지 스크롤
# 2. 인피니티 스크롤인 경우 30,000 길이까지만 스크롤

mobile_emulation = { "deviceName": "iPhone 12 Pro" }

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--incognito") #시크릿모드
chrome_options.add_experimental_option("detach", True)
chrome_options.add_argument("--auto-open-devtools-for-tabs")
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)

driver=webdriver.Chrome(options=chrome_options)

# 대상 URL 설정 
url = 'https://shopping.naver.com/home'
driver.get(url)
# 인피니티 스크롤 대처 변수 설정
endScroll = 30000

#대상 URL(네이버 쇼핑) 초기 레이어팝업 닫기 클릭하기
driver.find_element(By.XPATH,'//*[@id="gnb-header"]/div[4]/div/div/button[2]').send_keys(Keys.ENTER)

time.sleep(1)

#스크롤 함수
def webScroll(i_present_location):
    print("#####Start Scroll#####")
    time.sleep(1)
    #스크롤 시작지점 초기화
    from_scroll_height = 0
    #스크롤 종료지점 초기화
    to_scroll_height = 500
    last_height = driver.execute_script("return document.body.scrollHeight")    
    
    while True:
        #scroll 진행
        driver.execute_script("window.scrollTo("+ str(from_scroll_height) + "," + str(to_scroll_height) + ")")
        time.sleep(1)
        #현재 스크롤 위치
        present_location = driver.execute_script("return window.pageYOffset")
        #페이지 하단에 위치하면 종료
        if last_height == present_location:
            #하단 메뉴 보이고 나가기
            driver.execute_script("window.scrollTo("+ str(to_scroll_height) + "," + str(from_scroll_height) + ")")
            break
        #현 위치값이 인수로 넘어온 값보다 커지면 종료
        elif present_location > i_present_location:
            driver.execute_script("window.scrollTo("+ str(to_scroll_height) + "," + str(from_scroll_height) + ")")
            break
        else:
            #이동여부 판단 기준이 되는 이전 위치 값 수정
            last_height = driver.execute_script("return window.pageYOffset")
            #하단 위치 +500 씩 이동
            from_scroll_height = to_scroll_height + 1
            to_scroll_height = to_scroll_height + 500
    print("#####End Scroll#####")

#스크롤 함수 호출 : 함수에 넘기는 인수는 무한스크롤에 대처하기 위해 현 스크롤 위치가 인수값을 넘기면 종료시키기 위해 전달
webScroll(endScroll)

time.sleep(5)    
driver.quit()