Selenium:ChromeDriverをアップデートしてブラウザバージョンを合わせる の記事のように、Pythonファイルからのスクレイピング時、Seleniumが利用するChromeDriverと、Chromeアプリケーションとのバージョンが異なった場合にはエラーとなりセッションを作成することができません。
しかし、バージョン差異によるエラーが発生するたびに毎回ChromeDriverのアップデート作業が発生するのは面倒です。
そこで、自動的にChromeDriverのバージョンをブラウザのバージョンと一致させる webdriver_manager ライブラリを利用して、Pythonファイルが実行されるたびにバージョン差異をチェック、バージョンが異なる場合には自動的にバージョンが合う形でインストールされるようにしました。
Selenium v4の場合、下記コードによって自動的にバージョンを合わせる形でドライバーオブジェクトが生成されます。
# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
公式Git: SergeyPirogov/webdriver_manager\
以下、webdriver_managerのインストールおよび実行時に発生したエラーの解消方法とあわせて詳細をご紹介していきます。
目次:
- webdriver_managerライブラリで実行時にChromeバージョン一致
- 実行環境における権限エラー: pip install —user
- ModuleNotFoundError: No module named 'webdriver_manager’ のエラーが発生
- インストールされているSeleniumのバージョンをコマンドラインで調べる
- Selenium 4向けのコードを追加して自動的に最新版をインストールする形で実行
- Selenium純正のバージョン一致ツール: Selenium Manager
- Chrome限定のシンプルなバージョン一致ライブラリ: chromedriver-autoinstaller
webdriver_managerライブラリで実行時にChromeバージョン一致
webdriver_managerの動きとしては、プログラム実行時に現在のGoogle Chromeのバージョンを確認し、自動で適切なChrome Driverを当てたうえで実行するようになるようです。
seleniumでブラウザのバージョンを自動で揃える
seleniumでブラウザのバージョンを自動で揃える
Seleniumを実行した時、以下エラーが表示されました。 これは私のchromeがバージョン96で、今使っているChromeDriverはバージョン94までしか対応していないよという警告です。 Message: session not created: This version of ChromeDriver only supports Chrome version 94 Current browser version is 96.0.4664.55 with binary path /Applications/Google Chrome.app/Contents/MacOS/Google Chrome これはChrome側のバージョンとインストールされたWebdriverのバージョンが一致せずに発生するエラーです。chromeのバージョンアップは頻繁に発生するので毎回Webdriverの対応バージョンと揃えるのはめんどくさいです。 これを解消するためにChromeDriverManagerをインストールすることで自動的にバージョンを一致させることができます webdriver_managerをインストールします。 $ pip install webdriver_manager インストールが終わったら、以下を追記してください。 from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager //追記 Chrome = webdriver.Chrome(ChromeDriverManager().install()) //追記 これで問題なく動作します。
zenn.dev
なお、webdriver_managerはChromeのみならず、下記のさまざまなブラウザに対応しています。
For now support:ChromeDriver EdgeChromiumDriver GeckoDriver IEDriver OperaDriver
他にもwebdrivermanagerやwebdriver-managerなど類似のライブラリがあるようなのですが、webdriver_managerがライブラリの充実さからよく使われていそう。
参考1: 【Selenium】ChromeDriverを自動更新するPythonライブラリが便利 - ゆうきのせかい
【Selenium】ChromeDriverを自動更新するPythonライブラリが便利 - ゆうきのせかい
Python × Selenium × Chromeでブラウザ操作自動化をしてるけど、ブラウザバージョン更新のたびにChromeDriverを手動で更新するのが面倒すぎる! 自動更新する方法はないものか...? そんな悩みを抱えているかたへ。 たとえば、しばらくこれで動いても...
yuki.world
参考2: Webdriver Managerを使って実際に自動でWebDriverを更新する方法 - ソロメイカー
参考3: Python+SeleniumWebDriverではwebdriver_managerを使うといちいちdriverのexeを置き換えなくて済む - Qiita
以下、インストールおよび実行時に発生したエラーと解消方法についてご紹介。
実行環境における権限エラー: pip install —user
venvによる仮想環境で $ pip install webdriver-manager を実行しようとしたところ、下記権限エラーが発生。
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/idna-3.3.dist-info'
Consider using the --user
option or check the permissions.
指示されたとおり、下記のように—user オプションをつけて実行すると無事にインストールできましたが、後に下記エラーが発生。
$ pip install web-driver --user
ModuleNotFoundError: No module named 'webdriver_manager’ のエラーが発生
Selenium4の記述をしたコード(後述)を実行したところ、“webdriver_managerのモジュールが見つかりません”というエラーが発生しました。
そこで、pipでweb-driverをインストールするのではなく、pip3でwebdriver_managerとしてインストールしなおします。
$ pip3 install webdriver_manager
参考: python - ModuleNotFoundError: No module named 'webdriver_manager' error even after installing webdrivermanager - Stack Overflow
参考: pipインストール時のアクセス拒否の対応メモ - Qiita
参考: Pythonのpip installで「アクセスが拒否されました」と出た場合の対応 – 南の田舎の一室から
インストールされているSeleniumのバージョンをコマンドラインで調べる
つづいて、Seleniumのコーディング方法について。
GitHub上のRead.meには、Selenium 3 と Selenium 4のバージョンによって異なる記述方法が示されています。
インストールされているSeleniumのバージョンを調べるには、たとえばPython対話シェルで下記のように実行します。
$ python
>>> import selenium
>>> help (selenium)
...
VERSION
4.1.3
...
libraries - How do I check the version of the Selenium API installed? - Ask Ubuntu
Selenium 4向けのコードを追加して自動的に最新版をインストールする形で実行
公式を参考に、下記コードを追加します。
# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
これで無事に実行時にChromeDriverのバージョンをチェックし、バージョンに差異がある場合には自動て最新版をインストールしてくれるようになりました!
実行すると、実行時にターミナルに下記のように出力されます。
[WDM] - ====== WebDriver manager ======
[WDM] - Current google-chrome version is 114.0.5735
[WDM] - Get LATEST chromedriver version for 114.0.5735 google-chrome
[WDM] - About to download new driver from https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_mac64.zip
[WDM] - Driver has been saved in cache [/Users/username/.wdm/drivers/chromedriver/mac64/114.0.5735.90]
上記のように出力されれば、webdriver_managerが正常に動作しています!
(2023/11/04追記)現行のバージョン(4.15)では上記のようなメッセージは表示されないようになっています。
別途、手動でChromeDriverをアップデートする方法は Selenium:ChromeDriverをアップデートしてブラウザバージョンを合わせる の記事をご確認ください。
Selenium純正のバージョン一致ツール: Selenium Manager
本記事でご紹介した webdriver_manager はサードパーティ製ツールですが、Seleniumは4.6以降のバージョンから Selenium Manager なる純正のブラウザバージョン管理・一致ツールを同梱しているようです。(ただしベータ版)
Selenium Manager (Beta)
Selenium Manager is a command-line tool implemented in Rust that provides automated driver and browser management for Selenium. Selenium bindings use this tool by default, so you do not need to download it or add anything to your code or do anything else to use it.
www.selenium.dev
何らかの原因でwebdriver_managerが上手く動作しないという場合には、Selenium Managerを試してみるのも良いかもしれません。
参考: chromedriverが動かずwebdriver_managerからselenium managerへ乗り換え
備忘録:chromedriverが動かず、webdriver_managerからselenium managerへ乗り換え
python+seleniumでwebdriver_managerを使っていたが、chromedriverの環境変化で、 webdriver_manager が動作しなくなった。新しいバージョンのseleniumでるselenium managerを使い、うまく行った。手動でchromedriver を更新せず済んだ。
nabenavi.net
Chrome限定のシンプルなバージョン一致ライブラリ: chromedriver-autoinstaller
webdriver_managerとは異なり適用可能なブラウザはChromeのみとなりますが、同様のことをしてくれるライブラリとして、”chromedriver-autoinstaller” というものがあるようです。
chromedriver-autoinstaller · PyPI
こちらも適切なバージョンのchromedriverが存在するか確認し、存在しない場合は適切なバージョンのものをインストールしてくれるとのこと。
※ 私のケースではうまく動作してくれませんでした…!基本的にはwebdriver_managerを導入するほうが良いのではないでしょうか。
以下、導入方法を残しておきます。
■ インストール
pip3 install chromedriver-autoinstaller
下記のように1行追加すると、バージョンが合わない場合に適切なバージョンをインストールしてくれます。
from selenium import webdriver
import chromedriver_autoinstaller
# Check if the current version of chromedriver exists and download it if not found.
chromedriver_autoinstaller.install()
あとは通常どおり、driverを起動させたりしてSeleniumによるスクレイピングを実施すればOKです。
webdriver_managerはドライバ生成時にオプションとして指定する必要がありますが、chromedriver_autoinstallerはドライバを生成する前にシンプルにinstallメソッドを実行すれば良いだけです。
コードを書く際の書き方としては、chromedriver-autoinstallerの方がシンプルで書きやすいかもしれません。
参考: PythonでWebDriverのインストールを自動化したり補助するモジュールまとめ - Qiita
この記事の気になった箇所を読み返す:
- webdriver_managerライブラリで実行時にChromeバージョン一致
- 実行環境における権限エラー: pip install —user
- ModuleNotFoundError: No module named 'webdriver_manager’ のエラーが発生
- インストールされているSeleniumのバージョンをコマンドラインで調べる
- Selenium 4向けのコードを追加して自動的に最新版をインストールする形で実行
- Selenium純正のバージョン一致ツール: Selenium Manager
- Chrome限定のシンプルなバージョン一致ライブラリ: chromedriver-autoinstaller
category: 開発・プログラミング | エンジニアリング
tag: スクレイピング | Python