web-dev-qa-db-ja.com

PythonでSelenium Webdriverを使用してWebページをスクロールするにはどうすればよいですか?

現在、Selenium Webdriverを使用して、facebookのユーザーフレンドページを解析し、AJAXスクリプトからすべてのIDを抽出しています。しかし、私はすべての友人を得るために下にスクロールする必要があります。 Seleniumで下にスクロールするにはどうすればよいですか。私はpythonを使用しています。

87
user2523364

使用できます

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

ここで、Yは高さです(fullhdモニターでは1080です)。 (@lukeisに感謝)

使用することもできます

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

スクロールしてページの下部

必要な場合無限にロードされているページにスクロールする、ソーシャルネットワークのもの、facebookなど(@Cuong Tranに感謝)

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
170
OWADVL

無限ページの一番下までスクロールする場合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/131686

58
Cuong Tran

示されているのと同じメソッド ここ

pythonで使用できます

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

(Yは、スクロールする垂直位置です)

18
lukeis
from Selenium.webdriver.common.keys import Keys
html = browser.find_element_by_tag_name('html')
html.send_keys(Keys.END)

テスト済み、動作する

14
LIU YUE
element=find_element_by_xpath("xpath of the li you are trying to access")

element.location_once_scrolled_into_view

これは、表示されていない「li」にアクセスしようとしたときに役立ちました。

11
premonition

Webページを下にスクロールする方法は次のとおりです。

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

これらの答えはどれも、少なくともFacebookの検索結果ページを下にスクロールするのには役立ちませんでしたが、このソリューションを何度もテストした結果、次のことがわかりました。

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
4
Bass Dee

Youtubeを使用する場合、フローティング要素はスクロール高さとして値 "0"を与えるため、"return document.body.scrollHeight"を使用するのではなく、この値を使用してみてください"return document.documentElement。 scrollHeight "インターネット速度に応じてスクロール休止時間を調整します。そうしないと、1回だけ実行され、その後中断します。

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
3
Vinay Verma

動的なWebページをスクロールし、ページの最後に到達すると自動的に停止する方法を探していたところ、このスレッドが見つかりました。

@ Cuong Tran による投稿は、1つの主要な修正を加えて、私が探していた答えでした。この投稿は、他の人が修正が役立つと思うかもしれないと考えたためです(コードの動作に顕著な影響があります)。

変更は、最後のページの高さをキャプチャするステートメントを移動することですinside loop(各チェックが前のページの高さと比較されるように)。

したがって、以下のコード:

動的なWebページ(.scrollTo())を継続的にスクロールダウンし、1回の反復でページの高さが同じままである場合にのみ停止します。

(別の変更があり、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
3
Splarty

私の目的のために、ウィンドウの位置を念頭に置いて、さらに下にスクロールしたいと思いました。私の解決策は似ていてwindow.scrollYを使用しました

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

現在のyスクロール位置+ 200に移動します

3
Nick Brady

その問題を解決するために見つけた最も簡単な方法は、ラベルを選択して送信することでした:

label.sendKeys(Keys.PAGE_DOWN);

うまくいきますように!

3
Juanse

このコードは下にスクロールしますが、毎回待つ必要はありません。継続的にスクロールし、下部で停止します(またはタイムアウトします)

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秒待機するよりもはるかに高速です。

1
AlbertWolfgang

読み込みページをスクロールします。例:ミディアム、クオラなど

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
ashishmishra