結論
seleniumのバージョン4.3.0から、find_element_by_*系のメソッドが廃止されて使えなくなった。
経緯
今まで通りスクレイピングしている時に、環境を新しく作って動かしたらエラーが出た
該当のソースコード
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
options.add_argument("--headless")
browser = webdriver.Chrome(ChromeDriverManager().install(),options=options)
url = "https://www.google.co.jp/imghp?hl=ja"
browser.get(url)
kw_search = browser.find_element_by_css_selector("#sbtc > div > div.a4bIc > input")
エラー文
Traceback (most recent call last):
File "/Users/syoshika/.../scraping.py", line 22, in <module>
kw_search = browser.find_element_by_css_selector("#sbtc > div > div.a4bIc > input")
AttributeError: 'WebDriver' object has no attribute 'find_element_by_css_selector'
予想
エラーは直訳で、「"WebDriver"は"find_element_by_css_selector"という属性を持ってませんよ」 。
要するに定義されてないメソッドを使おうとしてるからエラーが来てるのかな?
こういうときは大体誤字ってる場合が多いんだけどそうでもなさそう。いつもこれ使ってたのにー。
原因
どうやら、find_elements_by_*系メソッドは バージョン4.3.0で廃止された みたい。
Selenium 4.3.0
Deprecated find_element_by_* and find_elements_by_* are now removed (#10712)
そういえば環境作り直した時に、Seleniumのバージョンを指定せずにインストールしてたわ。
試しにインストールされたSeleniumのバージョンを確認してみる
pip list | grep selenium
>>> selenium 4.3.0
やっぱりか。
最新バージョンがインストールされてたのでダメだったんだね。
というか、Selenium4系から元々メソッドの書き方が変わってた。
driver.find_elements_by_class_name("content")
# 引数にまとめて書くやり方に統一される
from selenium.webdriver.common.by import By
driver.find_elements(By.CLASS_NAME, "content")
対策
4.3.0よりも前をインストール
4.3.0より前のバージョンを再インストールすれば動いた。
pip install selenium==4.1.0
4系の書き方に合わせる
もしくはコードを4系と同じようにしてしまう。
from selenium.webdriver.common.by import By
kw_search = browser.find_element(By.CSS_SELECTOR, "#sbtc > div > div.a4bIc > input")
終わりに
(2022年7月4日 現在)
10日前にアプデが入ったばっかりみたいでした。
現行のSeleniumを使った記事はほとんど前の書き方だから、一旦自分の中で整理してからコードを読み替える必要がありそう。
参考にしたサイト