【Selenium】ChromeDriverを自動更新するPythonライブラリが便利

- Python -
2021.02.28
Python[パイソン]

Python × Selenium × Chromeでブラウザ操作自動化をしてるけど、ブラウザバージョン更新のたびにChromeDriverを手動で更新するのが面倒すぎる!

自動更新する方法はないものか...?

そんな悩みを抱えているかたへ。

たとえばGoogle Chromeだと...

Pythonfrom selenium import webdriver
import chromedriver_binary

driver = webdriver.Chrome()
driver.get('https://google.com')

しばらくこれで動いても、数週間も経てばGoogle Chromeが自動的にアップデートされChromeDriverとのバージョンが合わなくなり、結果SessionNotCreatedException例外が出てプログラムは動かなくなってしまいます。

$ python test.py
Traceback (most recent call last):
File "/Users/me/Desktop/test.py", line 5, in <module>
driver = webdriver.Chrome()
File "/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
・・・省略・・・
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 83

この例外対処のために、

  1. 現在のブラウザバージョンを確認する
  2. ブラウザバージョンに適合したWebDriverをダウンロード/インストールする

というチマチマ手作業が面倒くさすぎるんだよなぁ...と思っていたら、やっぱり世界のどこかの誰かがすでに解決してくれていました。

結論、webdriver_managerというライブラリを使えば面倒な手作業から永遠に開放されます

既に動いているプログラムがあっても、コードをほんの少し書き換えるだけで簡単なので一度試してみてください。

公式GitHub:SergeyPirogov/webdriver_manager

ChromeDriver(WebDriver)を自動更新するwebdriver_managerの導入方法

以下2ステップ。簡単です。

  1. webdriver_managerをインストール
  2. コードを少しだけ書き換える

1. webdriver_managerをインストール

pip install webdriver-managerでインストールします。

~ $ pip install webdriver-manager
Collecting webdriver-manager
Downloading https://files.pythonhosted.org/packages/32/28/a4e7638fc497ff8f86c6670a5f9f42dc018c37a0b254caa5e51799959da5/webdriver_manager-3.3.0-py2.py3-none-any.whl
Collecting crayons (from webdriver-manager)
Using cached https://files.pythonhosted.org/packages/5b/0d/e3fad4ca1de8e70e06444e7d777a5984261e1db98758b5be3e8296c03fe9/crayons-0.4.0-py2.py3-none-any.whl
Collecting configparser (from webdriver-manager)
Downloading https://files.pythonhosted.org/packages/08/b2/ef713e0e67f6e7ec7d59aea3ee78d05b39c15930057e724cc6d362a8c3bb/configparser-5.0.1-py3-none-any.whl
Collecting requests (from webdriver-manager)
Downloading https://files.pythonhosted.org/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl (61kB)
100% |████████████████████████████████| 61kB 828kB/s
Collecting colorama (from crayons->webdriver-manager)
Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl
Collecting urllib3<1.27,>=1.21.1 (from requests->webdriver-manager)
Downloading https://files.pythonhosted.org/packages/23/fc/8a49991f7905261f9ca9df5aa9b58363c3c821ce3e7f671895442b7100f2/urllib3-1.26.3-py2.py3-none-any.whl (137kB)
100% |████████████████████████████████| 143kB 996kB/s
Collecting idna<3,>=2.5 (from requests->webdriver-manager)
Using cached https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests->webdriver-manager)
Downloading https://files.pythonhosted.org/packages/5e/a0/5f06e1e1d463903cf0c0eebeb751791119ed7a4b3737fdc9a77f1cdfb51f/certifi-2020.12.5-py2.py3-none-any.whl (147kB)
100% |████████████████████████████████| 153kB 5.7MB/s
Collecting chardet<5,>=3.0.2 (from requests->webdriver-manager)
Downloading https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl (178kB)
100% |████████████████████████████████| 184kB 4.7MB/s
Installing collected packages: colorama, crayons, configparser, urllib3, idna, certifi, chardet, requests, webdriver-manager
Successfully installed certifi-2020.12.5 chardet-4.0.0 colorama-0.4.4 configparser-5.0.1 crayons-0.4.0 idna-2.10 requests-2.25.1 urllib3-1.26.3 webdriver-manager-3.3.0

~ $

Successfully installed...と表示されればOKです。

2. コードを少しだけ書き換える

既存のコードを少し書き換えます。以下、BEFORE / AFTERを見比べてみてください。

BEFOREfrom selenium import webdriver
import chromedriver_binary

driver = webdriver.Chrome()
driver.get('https://google.com')

2行目と4行目が少し変わっただけです。

AFTERfrom selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://google.com')

あとは実行するだけ

実行すると、もし現Google ChromeバージョンとChromeDriverがサポートするバージョンが異なる場合は、以下赤字部分にあるように現Chromeバージョンに適合するChromeDriverを自動的にダウンロードしてくれます。

$ python test.py

[WDM] - Current google-chrome version is 85.0.4183
[WDM] - Get LATEST driver version for 85.0.4183
[WDM] - Trying to download new driver from http://chromedriver.storage.googleapis.com/85.0.4183.87/chromedriver_mac64.zip
[WDM] - Driver has been saved in cache [/Users/me/.wdm/drivers/chromedriver/mac64/85.0.4183.87]

$

2度目の実行以降、ブラウザとDriverのバージョンチェックの結果がそろっている時にはキャッシュから実行されます。

$ python test.py

[WDM] - Current google-chrome version is 85.0.4183
[WDM] - Get LATEST driver version for 85.0.4183
[WDM] - Driver [/Users/me/.wdm/drivers/chromedriver/mac64/85.0.4183.87/chromedriver] found in cache

$

これでChromeDriverの手動更新作業から開放されます。

参考:ヘッドレスchromeで実行する場合

ブラウザを立ち上げないヘッドレスモードで実行したい時は、webdriver_managerを使おうが使うまいが書き方は変わりません。

以下4, 5, 6行目のようにwebdriver.Chrome()options引数を放り込むだけです。

Python(ヘッドレスモードで実行)from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://google.com')

Chrome以外のWebDriverを自動更新

記事タイトルでは"ChromeDriverを自動更新"と書きましたが、webdriver_managerはGoogle Chrome以外のブラウザもサポートしています。

Chrome以外で対応するブラウザ/Webドライバー

  1. Firefox / GeckoDriver
  2. Internet Explorer / IEDriver
  3. Microsoft Edge / MicrosoftWebDriver(EdgeChromiumDriver)
  4. Opera / OperaDriver

以下、それぞれのWebドライバーを自動更新するための手順です。

pip install webdriver-managerでインストール済みを前提とします。

FirefoxのGeckoDriverを自動更新

以下、ブラウザにFirefoxを使う場合です。

Pythonfrom selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager

driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
driver.get('https://google.com')

これを実行すると、もし現FirefoxバージョンとGeckoDriverがサポートするバージョンが異なる場合は、以下赤字部分にあるように現Firefoxバージョンに適合するGeckoDriverを自動的にダウンロードしてくれます。

$ python test.py

[WDM] - There is no [macos] geckodriver for browser in cache
[WDM] - Getting latest mozilla release info for v0.27.0
[WDM] - Trying to download new driver from https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-macos.tar.gz
[WDM] - Driver has been saved in cache [/Users/me/.wdm/drivers/geckodriver/macos/v0.27.0]

$

これでGeckoDriverの手動更新作業から開放されます。

Internet ExplorerのIEDriverを自動更新

以下、ブラウザにInternet Explorerを使う場合。

Pythonfrom selenium import webdriver
from webdriver_manager.microsoft import IEDriverManager

driver = webdriver.Ie(IEDriverManager().install())
driver.get('https://google.com')

EdgeのMicrosoftWebDriver/EdgeChromiumDriverを自動更新

以下、ブラウザにMicrosoft Edgeを使う場合。

Pythonfrom selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(EdgeChromiumDriverManager().install())
driver.get('https://google.com')

OperaのOperaDriverを自動更新

以下、ブラウザにOperaを使う場合。

Pythonfrom selenium import webdriver
from webdriver_manager.opera import OperaDriverManager

driver = webdriver.Opera(executable_path=OperaDriverManager().install())
driver.get('https://google.com')

まとめ:webdriver_managerのdriver自動更新は超便利

複数プログラムを稼働させていて、Google Chromeバージョンアップで全部死ぬという目に何度も合っていましたが、webdriver_managerのおかげで動かなくなる時間も更新の手間もゼロになりました。

また、このライブラリを使う前までunknown error: unable to discover open pagesというエラーが散発して困っていましたが、これを機にエラーがゼロに。

WebDriverの手動更新にわずらわしさを感じたことがあれば、ぜひ利用してみてください。

▼体型的なスクレイピング学習におすすめ

 

↑TOP