こんにちは!
GASを使った業務改善に夢中の初心者プログラマー太郎です。
最近、Google Colaboratoryをよくいじるのですが、Seleniumを用いてスクレイピングをしていてかなり困ったことがありました。
エラーの内容は
StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
と、スクレイピングをしていれば頻繁に出会うものでした。
これはつまり、
「ページ内容の読み込みを完了する前に、スクレイピングしようとしちゃってるよ!読み込みが完了するまで待ってね!」ということを要請しているエラーなのです。
このような場合、
driver.implicitly_wait(10)
などでページの読み込みを待つのが定石です。
ただ、なぜか今回は、原因と思しきあらゆる箇所に上記の読み込み待ちをするコードを挿入しても解決しませんでした。
困って困っていろいろ調べても出てこなくて、3時間くらい費やしたのですが、ふと、、、
「読み込みを待つ云々の問題じゃなく、そもそもボタンをクリックする速度が速すぎるんじゃない?」
と思い立ちました。
driver.implicitly_wait()
自体は読み込みが完了するまで待つ。逆に言えば、読み込みが一瞬で終わってしまったらすぐに次の動作に行く、ということなので、この速度をスクレイピング対象のサイトが嫌がったのではないかとと考えたわけです。
そこで、ページの読み込みを少しスローにしてあげようと思い立ち、、、
import time
time.sleep(1)
気になった箇所にとりあえず1秒間休み時間を入れました。
すると、無事解決!!!
スクレイピングする速度自体を落としてあげることが解決につながりました!
スクレイピングをするときには
読み込みの完了を待つだけでなく、スクレイピングを行う速さも考慮に入れてあげる必要があるんですね。
ネットで調べても、StaleElementReferenceException
が出た時の対処法はdriver.implicitly_wait()
で待つ方法しか見つからなかったので、今回の記事がどなたかのお役に立てると幸いです。