Python+Selenium+WebDriverでスクレイピングするときに、要素(Element)を見つける「driver.find_element()」を実行すると、要素が見つからずにエラーになることがある。
ここでは、ブラウザのサイズを設定することで解決する方法を説明する。
GoogleMapsで検索した結果の一覧表を作成するプログラムを使用した。
動作環境:
- Python 3.8.3
- OS:Windows10-Pro [Version 10.0.19044.1889]
- ブラウザ:Chrome 104.0.5112.102(Official Build) (64 ビット)
- ライブラリ:Selenium 4.3.0(Selenium 3とはパラメータの渡し方が異なる)
- サイト:Google Maps(https://maps.google.co.jp/)
これらのサイトを参考にしました。
https://blog.enjoyxstudy.com/entry/2020/11/03/000000
(1)正常動作する場合
GoogleMapsで「不動産屋 世田谷区」で検索したときの画面である。
下記Chromeのサイズは、1920×1080である。
上画面の左側の検索結果一覧の「(株)アドキャスト明大前支店」をクリックして、
下画面の中央に「(株)アドキャスト明大前支店」の詳細情報が表示された。
会社の詳細情報の「住所」を取得するためのソースである。
これを実行すると、find_element()でElement(要素)が見つかった。
このときのブラウザのサイズは、「driver.set_window_size(ブラウザのwidth, ブラウザのheight)」で1920x1080に設定した。
(2)エラーになる場合
ブラウザを表示させないヘッドレスモード(Headless Mode)で、Element(要素)を取得できないエラーが発生するので、原因を調べるため「通常表示」させた。
下記Chromeのサイズは、800×600である。
上の画面左側の検索結果一覧の「目黒世田谷不動産」をクリックして、
下の画面中央ではなく左側に「目黒世田谷不動産」の詳細情報が表示された。
会社の詳細情報の「住所」を取得するためのヘッドレスモードのソースである。
これを実行すると、find_element()でElement(要素)が見つからないエラーになる。
ブラウザのサイズを「driver.get_window_size()」で取得すると、800x600になっているので、ブラウザを通常表示させてみると、中央に表示するスペースがないため左側に表示された「会社の詳細情報」が、ブラウザの高さが小さいため「住所」が表示されていないことがわかった。
それで、ブラウザのサイズを「driver.set_window_size(ブラウザのwidth, ブラウザのheight)」で1920x1080に変更したら、Element(要素)が見つかり、正常に動作した。
また、これまでの説明とは別にSelenium4では、ヘッドレスモードの設定方法が変更になった。
ブラウザを同じサイズに設定しても、ヘッドレスモードと通常表示モードでは動作が異なることがあるが、現時点では原因不明である。
- 投稿タグ
- Python, Selenium, WebDriver, ブラウザのサイズ取得, ブラウザのサイズ指定, ヘッドレスモード