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を当てたうえで実行するようになるようです。
なお、webdriver_managerはChromeのみならず、下記のさまざまなブラウザに対応しています。
For now support:ChromeDriver EdgeChromiumDriver GeckoDriver IEDriver OperaDriver
他にもwebdrivermanagerやwebdriver-managerなど類似のライブラリがあるようなのですが、webdriver_managerがライブラリの充実さからよく使われていそう。
参考1: 【Selenium】ChromeDriverを自動更新するPythonライブラリが便利 - ゆうきのせかい
参考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
参考: 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 なる純正のブラウザバージョン管理・一致ツールを同梱しているようです。(ただしベータ版)
何らかの原因でwebdriver_managerが上手く動作しないという場合には、Selenium Managerを試してみるのも良いかもしれません。
参考: chromedriverが動かずwebdriver_managerからselenium managerへ乗り換え
Chrome限定のシンプルなバージョン一致ライブラリ: chromedriver-autoinstaller
webdriver_managerとは異なり適用可能なブラウザはChromeのみとなりますが、同様のことをしてくれるライブラリとして、”chromedriver-autoinstaller” というものがあるようです。
こちらも適切なバージョンの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: 開発・プログラミング | エンジニアリング