Python Selenium スクレイピング

【Python】Seleniumでデベロッパツールで存在する要素を指定したのに「no such element: Unable to locate element」が出る原因

この記事は約3分で読めます。

 

先日MENTAで表題のような質問を頂いたので、その時の解答をメモしておきます。

 

まずページソースを見る

 

基本的にデベロッパツールでは要素が表示されているのに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エラーが返された時の解決策

 

終わり~参考書紹介

 

 

コメント

タイトルとURLをコピーしました