先日MENTAで表題のような質問を頂いたので、その時の解答をメモしておきます。
Contents
まずページソースを見る
基本的にデベロッパツールでは要素が表示されているのにSeleniumでその要素を指定すると「no such element: Unable to locate element」が出るときはまずSeleniumのドライバーが読み込んでいるHTMLを確認しましょう。
こういう場合はスクレイピングのBOT検知に引っかかって403のエラーメッセージが返されていたり読み込めていないケースが多いです。
Seleniumのドライバーが読み込んでいるHTMLは以下で確認できます。
print(driver.page_source)
よくある原因
①Javascript非同期でHTMLを吐き出している
よくあるのが、HTMLがJavascriptによって非同期で生成されている場合です。これはモダンなECサイトなんかでよくあります。こういう場合はアクセスしてもすぐ要素が生成されず、数秒後にHTML要素が生成されるので、Seleniumで高速で要素を指定すると、それがサイト側のJSによるHTML生成に追いついておらず「no such element: Unable to locate element」になるパターンがあります。
こういう場合はプログラムの実行をサイト側がHTMLを生成するまで待ってあげる必要があります。
<解決例イメージ>
~~ import time driver = webdriver.Chrome(/driver,desired_capabilities=d) driver.get(url) # 次のプログラムの実行を数秒待つ time.sleep(5) check1 = driver.find_element_by_xpath("/html/body/~~/input") check1.click()
②webページにワイヤーフレームが使われている
2つ目はWEBページにワイヤーフレームが使われているパターンです。
ワイヤーフレームとは:https://nandemo-nobiru.com/web-5695
これだとフレームごとにHTMLが完全に分割されているので、デベロッパツールから見たXPATHや要素をそのまま指定してもアクセスできません。
解決法はサイトのIframeタグからフレーム名を特定してフレームを切り替えることです。
# フレームを切り替える driver.switch_to.frame('フレーム名') # 一番上のコンテンツに戻る driver.switch_to.default_content()
③スクレイピングがばれてIPが弾かれている
この場合はTorなどでIPを切り替える必要があります。
関連記事:【Python】SeleniumでTor経由でIPを切り替えつつスクレイピングする
関連記事:【Python】Requestsでサイトをスクレイピングした時に403エラーが返された時の解決策
終わり~参考書紹介
コメント