【PythonでWEBスクレイピング】値が取得できない場合の待機処理(selenium)

画面の表示をJavaScriptに頼っているWEBサイトも多いので、表示するまでにラグがあり値が取得できないことがあります。少し待機すれば良いのですが、待機の方法を確認してみる。
目次
待機する方法
プログラムのスリープ(time.sleep)
スクレイピングに限らず、あえて処理を遅らせたい場合に使う。記述した箇所で待機し、次の処理に進まずに指定時間必ず待つ。
import time time.sleep(5) # 5秒間待機
要素見つける待機時間を指定する(implicitly_wait)
要素が見つからない場合の待機時間を指定する。これを一度指定すると、find_element等の処理で要素が見つからない場合、指定の時間だけ待機してくれる。時間内に要素が見つかった場合は、直ちに次の処理に進んでくれます。
待機時間が経過しても見つからない場合には、NoSuchElementExceptionが発生する。
from selenium import webdriver from selenium.webdriver.chrome.service import Service chromedriver_path = 'hogehoge' options = webdriver.ChromeOptions() options.add_argument('--headless') service = Service(executable_path=chromedriver_path) driver = webdriver.Chrome(service=service,options=options) driver.implicitly_wait(10) # 要素が見つからない場合、10秒まで待機する
指定した要素が読み込まれるまで待機する(presence_of_element_located)
id, class, name, xpath等を指定し、それが読み込まれるまで待機する処理。
今回はpresence_of_element_locatedを使用したが、EC(expected_conditions)には、他にも様々な判定がある(Selenium 4.30.0 documentation)。指定したテキストが表示されるまで待機する「text_to_be_present_in_element」や、指定したテキストがページタイトルに現れるまで待機する「title_contains」など。指定した要素が非表示になるまで待機する「invisibility_of_element_located」なんてのもあるので、詳しくはドキュメント参照。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By url = 'hogehoge' driver.get(url) WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, "idName"))) # id="idName"の要素が読み込まれるまで待機
まとめ
使ってみた感想としては、expected_conditionsが◎。チェックするのに適した要素や文字列が存在する場合はこれが最適。implicitly_waitやtime.sleepと比較して、待機するタイミングを自由に決定できる事や、表示された事(もしくは表示されてない事)を担保して次の処理に進めることが大きいと感じた。
良い判定方法が見つからない場合には、カスタム待機条件を実装するなんていう事も出来るようなので、興味津々です。
https://qiita.com/nisihunabasi/items/acc7b78e73e02bcd8ee8
ではまた。