chromedriverとgoogle chromeのバージョン合わせ

python×selenium×chromedriverでwebスクレイピングを行う機会があり、chromedriverとgoogle chromeのバージョン合わせをすることに。chromedriverを使う際には、google chromeとバーションをうまく合わせないとエラーが吐かれるので気をつけましょう。
対処手順をみていきましょう。

互換性のないバージョンによるエラー

chromedriverとgoogle chromeのバージョンに互換性がない場合に、エラーが吐かれることがあります。
私の環境では、以下のようなエラー内容でした。

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 77

「このバージョンのChromeDriverはChrome77のみをサポートします。」だそうです。

手順1 : Chromeのバージョンを確認する

普段使いしているgoogle chromeのバージョンを確認します。
Chromeの立ち上げ → 設定 → Chrome について(左欄の項目)と進みます。

google chromeのバージョン確認

私の環境では、バージョン79.0.3945.88であることがわかります。

手順2 : chromedriver-binaryのバージョンを確認する

次に、すでにインストールされているchromedriver-binaryのバージョンを確認します。

import chromedriver_binary
chromedriver_binary.__version__

これで確認できると思いきや、上手くいかないので以下コマンドから確認します。

$ pip list

結果の中から、chromedriver-binaryを探します。

手順3 : 対応するバージョンのchromedriver-binaryをインストール

まずはじめに、インストールできるchromedriver-binaryのバージョンを確認します。

$ pip install chromedriver-binary==  
ERROR: Could not find a version that satisfies the requirement chromedriver-binary== (from versions: 2.29.1, 2.31.1, 2.33.1, 2.34.0, 2.35.0, 2.35.1, 2.36.0, 2.37.0, 2.38.0, 2.39.0, 2.40.1, 2.41.0, 2.42.0, 2.43.0, 2.44.0, 2.45.0, 2.46.0, 70.0.3538.16.0, 70.0.3538.67.0, 70.0.3538.97.0, 71.0.3578.30.0, 71.0.3578.33.0, 71.0.3578.80.0, 71.0.3578.137.0, 72.0.3626.7.0, 72.0.3626.69.0, 73.0.3683.20.0, 73.0.3683.68.0, 74.0.3729.6.0, 75.0.3770.8.0, 75.0.3770.90.0, 75.0.3770.140.0, 76.0.3809.12.0, 76.0.3809.25.0, 76.0.3809.68.0, 76.0.3809.126.0, 77.0.3865.10.0, 77.0.3865.40.0, 78.0.3904.11.0, 78.0.3904.70.0, 78.0.3904.105.0, 79.0.3945.16.0, 79.0.3945.36.0)
ERROR: No matching distribution found for chromedriver-binary==

上記コマンドで、インストールできるバーションのリストを出力します。
==以降には本来chromedriverのバージョンが入るのですが、わざと空欄にしてエラーを吐かせます。

手順1でGoogle chromeのバージョンが79だったので、chromedriver-binaryの方も79.XXXXのものを入れます。リストから、79系の最新バージョンをインストールしてみます。

$ pip install chromedriver-binary==79.0.3945.36.0

ここまで正しく手順を踏めていれば、無事seleniumでchromedriverが使えるようになっているでしょう。うまくいきましたか。

番外編:chromedriverの起動オプション

chromedriverにはいくつかの起動オプションが存在します。
スクレイピングをサーバ上で運用することになり、画面出力のない環境でchromedriverを使用する際に、いつくか必要なオプションがあるので、書き留めておきます。

from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.chrome.options import Options
# ### chromedriver起動オプション
chrome_options = Options()
# サーバでの運用など、画面出力無しの場合に必要なオプション
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')
# dockerを使用する場合は、以下のオプションも
options.add_argument('--disable-dev-shm-usage')
# ウィンドウサイズ変更
options.add_argument('--window-size=640x480')
# ### chromeをオプション付きで立ち上げ
browser = webdriver.Chrome( chrome_options=chrome_options )
# rowser.set_window_size( 640, 480 )   #ウィンドウサイズはoptionsを使わずに指定することもできる

画面出力を必要としない場合、–headless, –no-sandbox, –disable-gpuオプションを付けます。
dockerを使う場合、–disable-dev-shm-usageオプションが必要でした。このオプションを付けないと、一応立ち上がりますが途中でクラッシュしてしまいます。クラッシュ時のエラーメッセージはこちら。

Message: unknown error: session deleted because of page crash
from unknown error: cannot determine loading status
from tab crashed  (Session info: headless chrome=79.0.3945.130)

このエラーでお困りの方は、試してみてください。

google chromeは時々アップデートをすることがあると思うので、この手順は頭の片隅に置いておくと良いかもしれません。
以上、chromedriverとgoogle chromeのバージョンを合わせる手順についてでした。

追記:
google chrome 81.0.4044.129 × chrome driver binary 81.0.4044.69.0
この組み合わせで、chromeが変な挙動をするのは私だけでしょうか。
起動時に”–user-data-dir”でディレクトリを指定するとおかしくなる?

selenium.common.exceptions.WebDriverException: Message: chrome not reachable
  (Driver info: chromedriver=2.39.562713 (dd642283e958a93ebf6891600db055f1f1b4f3b2),platform=Mac OS X 10.15.3 x86_64)

何か情報をお持ちの方は教えていただけると、、、