파이썬에서 셀레늄 웹 드라이버를 사용하여 웹 페이지를 스크롤하는 방법은 무엇입니까?


131

현재 셀레늄 웹 드라이버를 사용하여 페이스 북 사용자 친구 페이지를 구문 분석하고 AJAX 스크립트에서 모든 ID를 추출합니다. 그러나 모든 친구를 얻으려면 아래로 스크롤해야합니다. 셀레늄에서 아래로 스크롤하는 방법 나는 파이썬을 사용하고 있습니다.



driver.execute_script (f "window.scrollTo (0, {2 ** 127});")
AturSams 2016 년

답변:


263

당신이 사용할 수있는

driver.execute_script("window.scrollTo(0, Y)") 

여기서 Y는 높이입니다 (fullhd 모니터의 경우 1080). (@lukeis에게 감사합니다)

당신은 또한 사용할 수 있습니다

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

스크롤 페이지 하단 .

당신이 원하는 경우 무한 로딩 페이지에 스크롤 소셜 네트워크 것과 같은, 페이스 북 등 (@Cuong 트란 덕분에)

SCROLL_PAUSE_TIME = 0.5

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

Juanse 덕분에 다른 방법은 객체를 선택하고

label.sendKeys(Keys.PAGE_DOWN);

1
훌륭합니다. 조금 설명 할 수 있습니다. scrollHeight그 의미는 무엇이며 일반적으로 어떻게 작동합니까?
Jason Goal

그러면 "last_height"변수를 어떻게 사용 하시겠습니까? 코드에 비슷한 것이 있으며 브라우저가 아래로 스크롤됩니다. 그러나 데이터를 볼 때 스크래핑하는 경우 첫 페이지의 데이터를 k 번만 스크랩합니다. "k"는 브라우저가 스크롤되는 횟수입니다.
Peter Lenaers 19

72

무한 페이지의 맨 아래스크롤 하려는 경우 (예 : linkedin.com) 경우이 코드를 사용할 수 있습니다.

SCROLL_PAUSE_TIME = 0.5

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

참조 : https://stackoverflow.com/a/28928684/1316860


대단하다. 인스 타 그램에서 이것을 사용하려는 사람은 먼저 ActionChains를 사용하여 "추가로드"버튼을 탭한 다음 Cuong Tran의 솔루션을 적용해야합니다 ... 적어도 그것은 저에게 효과적입니다.
Mwspencer

답변 해주셔서 감사합니다! 내가하고 싶은 것은 인스 타 그램에서 페이지 하단으로 스크롤 한 다음 페이지의 전체 HTML을 가져 오는 것입니다. 셀레늄에 last_height를 입력으로 제공하고 맨 아래로 스크롤 한 후 전체 페이지 HTML을 얻을 수있는 기능이 있습니까?
Swan87

2
SCROLL_PAUSE_TIME에 따라 다름, 그것은 나를 위해 2 초 주위에 걸립니다.
ssi-anik


21

여기에 표시된 것과 동일한 방법 :

파이썬에서는 그냥 사용할 수 있습니다

driver.execute_script("window.scrollTo(0, Y)")

(Y는 스크롤하려는 세로 위치입니다.)


15
element=find_element_by_xpath("xpath of the li you are trying to access")

element.location_once_scrolled_into_view

이것은 보이지 않는 'li'에 액세스하려고 할 때 도움이되었습니다.


'find_element_by_xpath'는 드라이버 함수이거나 '.location_once_scrolled_into_view'는 오류를 반환합니다. NoSuchElementException : 메시지 : 해당 요소가 없습니다 : 요소를 찾을 수 없습니다 : { "method": "xpath", "selector": "// * [@ id = "timeline-medley"] / div / div [2] / div [1] "}
Walid Bousseta

한 가지 더. 이유 location_once_scrolled_into_view없이 호출해야 () IS location_once_scrolled_into_view파이썬입니다 property. 소스 코드는 여기를 참조하십시오 : d3b6ad006bd7dbee59f8539d81cee4f06bd81d64의 selenium / webelement.py · SeleniumHQ / selenium
DataAlchemist

10

내 목적을 위해 창 위치를 염두에두고 더 아래로 스크롤하고 싶었습니다. 내 솔루션은 비슷하고 사용되었습니다.window.scrollY

driver.execute_script("window.scrollTo(0, window.scrollY + 200)")

현재 y 스크롤 위치 + 200으로 이동합니다


8

다음은 웹 페이지를 아래로 스크롤하는 방법입니다.

driver.execute_script("window.scrollTo(0, 1000);")

7

그 문제를 해결하는 가장 쉬운 방법은 레이블을 선택한 다음 보내는 것입니다.

label.sendKeys(Keys.PAGE_DOWN);

그것이 효과가 있기를 바랍니다!


6

이 답변 중 어느 것도 페이스 북 검색 결과 페이지를 스크롤 다운하지 않았지만 나에게 도움이되지는 않았지만이 솔루션을 많이 테스트 한 후에 발견되었습니다.

while driver.find_element_by_tag_name('div'):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    Divs=driver.find_element_by_tag_name('div').text
    if 'End of Results' in Divs:
        print 'end'
        break
    else:
        continue

그것은 작동하지만 매우 느립니다 (적어도 나를 위해). 나는 당신이 설정 한 경우 발견 SCROLL_PAUSE_TIMEstackoverflow.com/a/27760083/73267142, 그것은 잘 작동하고 당신은 빠른 속도로 100 배 아래로 스크롤합니다.
LucSpan

6

유튜브와 함께 작업 할 때 부동 요소는 그렇게하지 않고 사용하는 것보다 스크롤 높이와 같은 값 "0"줄 "document.body.scrollHeight를 돌려" 이 하나를 사용하여 시도 "document.documentElement.scrollHeight를 반환"을 인터넷에 따라 스크롤 일시 정지 시간을 조정 그렇지 않으면 속도는 한 번만 실행 된 후 중단됩니다.

SCROLL_PAUSE_TIME = 1

# Get scroll height
"""last_height = driver.execute_script("return document.body.scrollHeight")

this dowsnt work due to floating web elements on youtube
"""

last_height = driver.execute_script("return document.documentElement.scrollHeight")
while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0,document.documentElement.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.documentElement.scrollHeight")
    if new_height == last_height:
       print("break")
       break
    last_height = new_height

5

동적 웹 페이지를 스크롤하는 방법을 찾고 있었고 페이지 끝에 도달하면 자동으로 중지 되어이 스레드를 찾았습니다.

@Cuong Tran 의 게시물 하나의 주요 수정 사항으로 내가 찾고있는 대답이었습니다. 다른 사람들이 수정이 도움이 될 수 있다고 생각했습니다 (코드 작동 방식에 현저한 영향을 미침).

수정은 루프 에서 마지막 페이지 높이를 캡처하는 명령문을 이동하여 각 검사가 이전 페이지 높이와 비교되도록하는 것입니다.

따라서 아래 코드는

동적 웹 페이지 ( .scrollTo())를 계속 아래로 스크롤하여 한 번의 반복으로 페이지 높이가 동일하게 유지되는 경우에만 중지합니다.

(break 문이 제거 될 수있는 다른 조건 (페이지 '스틱'의 경우) 내에있는 다른 수정이 있습니다).

    SCROLL_PAUSE_TIME = 0.5


    while True:

        # Get scroll height
        ### This is the difference. Moving this *inside* the loop
        ### means that it checks if scrollTo is still scrolling 
        last_height = driver.execute_script("return document.body.scrollHeight")

        # Scroll down to bottom
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # Wait to load page
        time.sleep(SCROLL_PAUSE_TIME)

        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:

            # try again (can be removed)
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

            # Wait to load page
            time.sleep(SCROLL_PAUSE_TIME)

            # Calculate new scroll height and compare with last scroll height
            new_height = driver.execute_script("return document.body.scrollHeight")

            # check if the page height has remained the same
            if new_height == last_height:
                # if so, you are done
                break
            # if not, move on to the next loop
            else:
                last_height = new_height
                continue

5

이 코드는 맨 아래로 스크롤되지만 매번 기다릴 필요는 없습니다. 계속 스크롤 된 다음 맨 아래 (또는 시간 초과)에서 중지됩니다.

from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get('https://example.com')

pre_scroll_height = driver.execute_script('return document.body.scrollHeight;')
run_time, max_run_time = 0, 1
while True:
    iteration_start = time.time()
    # Scroll webpage, the 100 allows for a more 'aggressive' scroll
    driver.execute_script('window.scrollTo(0, 100*document.body.scrollHeight);')

    post_scroll_height = driver.execute_script('return document.body.scrollHeight;')

    scrolled = post_scroll_height != pre_scroll_height
    timed_out = run_time >= max_run_time

    if scrolled:
        run_time = 0
        pre_scroll_height = post_scroll_height
    elif not scrolled and not timed_out:
        run_time += time.time() - iteration_start
    elif not scrolled and timed_out:
        break

# closing the driver is optional 
driver.close()

응답이 0.1 초가 걸릴 수있는 응답을 할 때마다 0.5-3 초를 기다리는 것보다 훨씬 빠릅니다.


3

로딩 페이지를 스크롤하십시오. 예 : 매체, quora 등

last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight-1000);")
        # Wait to load the page.
        driver.implicitly_wait(30) # seconds
        new_height = driver.execute_script("return document.body.scrollHeight")
    
        if new_height == last_height:
            break
        last_height = new_height
        # sleep for 30s
        driver.implicitly_wait(30) # seconds
    driver.quit()

1
driver.quit ()가 while 블록 외부에 있어야합니까? 또한 마지막 암시 적 대기는 필요하지 않습니다. 누군가 pls는 확인합니다. @ashishmishra
ihightower

1

특정보기 / 프레임 (WebElement) 에서 스크롤 하려면 "body"를 스크롤하려는 특정 요소로 바꾸면됩니다. 아래 예에서 "getElementById"를 통해 해당 요소를 가져옵니다.

self.driver.execute_script('window.scrollTo(0, document.getElementById("page-manager").scrollHeight);')

예를 들어 YouTube 의 경우입니다 .


1

ScrollTo()기능은 더 이상 작동하지 않습니다. 이것이 내가 사용한 것이고 잘 작동했습니다.

driver.execute_script("document.getElementById('mydiv').scrollIntoView();")

이 방법 만 제 경우에는 효과가 있었지만 다른 것은 효과가 없었습니다. 감사.
ePandit

0
driver.execute_script("document.getElementById('your ID Element').scrollIntoView();")

내 사건을 해결하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.