Selenium WebDriver for Pythonでページが読み込まれるまで待つ 質問する

Selenium WebDriver for Pythonでページが読み込まれるまで待つ 質問する

無限スクロールで実装されたページのすべてのデータをスクレイピングしたいです。次の Python コードが機能します。

for i in range(100):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)

つまり、一番下までスクロールするたびに 5 秒待つ必要がありますが、これは通常、ページが新しく生成されたコンテンツの読み込みを完了するのに十分です。ただし、これは時間効率が良くない可能性があります。ページは 5 秒以内に新しいコンテンツの読み込みを完了する場合があります。スクロールするたびにページが新しいコンテンツの読み込みを完了したかどうかをどのように検出できますか? これを検出できれば、ページの読み込みが完了したことがわかったら、もう一度スクロールしてさらに多くのコンテンツを表示できます。この方が時間効率が良いです。

ベストアンサー1

webdriverデフォルトでは、メソッドを介してページが読み込まれるまで待機します.get()

@user227215 が言ったように、特定の要素を探している可能性があるので、WebDriverWaitページにある要素を待つために次のようにする必要があります。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

browser = webdriver.Firefox()
browser.get("url")
delay = 3 # seconds
try:
    myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))
    print "Page is ready!"
except TimeoutException:
    print "Loading took too much time!"

私はアラートを確認するためにこれを使用しました。ロケーターを見つけるには、他のタイプの方法を使用することもできます。

編集1:

デフォルトでは、 はwebdriverページの読み込みを待機します。フレーム内の読み込みや Ajax リクエストを待機しません。つまり、 を使用すると.get('url')、ブラウザはページが完全に読み込まれるまで待機し、その後コード内の次のコマンドに進みます。ただし、Ajax リクエストを送信する場合、 はwebdriver待機しないため、ページまたはページの一部が読み込まれるまで適切な時間待機するのはユーザーの責任です。そのため、 というモジュールがありますexpected_conditions

おすすめ記事