1. ホーム
  2. パイソン

[解決済み】Selenium WebDriver for Pythonでページが読み込まれるまで待機する。

2022-04-04 08:45:44

質問

無限スクロールで実装されたページのデータを全てスクレイピングしたい。以下のpythonのコードは動作します。

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

これは、下までスクロールするたびに5秒待つ必要があることを意味します。これは一般に、ページが新しく生成されたコンテンツの読み込みを終えるのに十分な時間です。しかし、これでは時間効率が悪いかもしれません。ページが5秒以内に新しいコンテンツの読み込みを終えるかもしれません。スクロールダウンするたびに、ページが新しいコンテンツの読み込みを終了したかどうかを検出するにはどうすればよいでしょうか?もし検出できれば、ページの読み込みが終了したことがわかった時点で、もう一度スクロールダウンしてコンテンツを見ることができます。この方が時間効率が良いのです。

解決方法は?

その webdriver によって、デフォルトでページの読み込みを待ちます。 .get() メソッドを使用します。

ユーザ 227215 が言うように、特定の要素を探しているのであろう。 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!"

アラートの確認に使っています。他の型のメソッドでロケーターを見つけることができます。

EDIT 1:

言っておくと webdriver はデフォルトでページが読み込まれるのを待ちます。フレーム内の読み込みやajaxリクエストは待ちません。つまり .get('url') ブラウザはページが完全に読み込まれるまで待ち、コードの次のコマンドに進みます。しかし、ajaxリクエストを投稿しているとき。 webdriver ページまたはページの一部が読み込まれるのを適切な時間待つのは、あなたの責任です。 expected_conditions .