自分が遭遇するウェブクローリング・スクレイピングのエラーはたいてい、StaleElementReferenceException
かWebDriverException: Message: unknown error: Element is not clickable at point
あたりだ。
スクロールしないと取得できない要素だったり、画面外の要素を取得できなかったりということが理由と考えられる。
基本の対処法は2つ。
1つめは、スクロール。
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
をいれることで、要素の出現を促す。
画面外と指摘される場合は、その要素が出現する箇所までスクロールする。
button = driver.find_element_by_tag_name('button') for i in range(50): driver.execute_script("window.scrollTo(0, {})".format(i*100)) try: button.click() break except WebDriverException: pass
2つめは、リトライ。 時間をあけて何回か挑戦する。
# 初期設定 failed = True try_cnt = 0 # クリックできるまで、10回までトライする。 while failed and try_cnt < 10: if try_cnt >= 10: break try_cnt += 1 try: s.click() failed = False except WebDriverException: time.sleep(1)
番外編として、クリックする前にマウスオーバーする。 有効な場合もある。
s = driver.find_element_by_tag_name('span')
hover = ActionChains(driver).move_to_element(s)
hover.perform()