SessionNotCreatedException 対処方法
■ 主の PC環境一覧
OS:Windows11
CPU:Intel® Core™ i9 13900KF
Memory:64GB
Python:3.9.4
pip:20.3.4
Chrome
■ 初めに
Selenium
を使用したスクレイピングもしくはクローリングで、以下のようなエラーが発生した場合に webdriver
のアップデートを行い対応していませんか?
$ python main.py
---
# エラーログ
Traceback (most recent call last):
File "/workspace/main.py", line 4, in <module>
driver = webdriver.Chrome()
--- 省略 ---
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 83
■ 原因
恐らく、実行時に上記のようなエラーログが出力されている方は、以下に示すような実装になっていると思います。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://google.com')
本エラーは、指定するブラウザ(ここでは Chrome)のバージョンがアップデートされた際に引き起こされるエラーとなります。
厳密にいうと、Chromeのバージョンと webdriver
のバージョンで整合性が取れない場合に発生します。
スクレイピングやクローリングを行うには webdriver
パッケージを使用します。
それに伴い、ブラウザを操作と webdriver
は依存関係にあると言えます。
故に、ブラウザのバージョンが更新されると、必然的に webdriver
のバージョンも更新されるわけです。
しかし、開発時点でインストールされた webdriver
は、Chromeのバージョンが更新されても自動的に更新されません。
そのため、Chrome
のバージョン更新に伴い、手動的に webdriver
を更新してあげないと整合性が取れず、この度のエラーが発生します。
■ 解決
前述までの説明を理解していただけたら、ブラウザのバージョンが更新されるごとに、毎回、webdriver
を更新してあげればよいと考える方がほとんどだと思います。
そのようなことをしなくても、便利な方法があります。
□ ChromeDriverManager
ChromeDriverManager
は webdriber
と同じく Pythonのパッケージです。
では、前述の方法(webdriver
の手動更新)と変わって何が便利なのかを簡単に説明いたします。
ChromeDriverManager
とは?Selenium
を使う場合、ブラウザ(Chromeや Edgeなど)のドライバが必要ですが、ChromeDriverManager
は実行時に、毎回、適切なドライバを自動的にダウンロードやインストール、管理を行ってくれる優れものです。
故に、ChromeDriverManager
は実行時に都度都度その時の最新バージョンを取得し処理が実行されるので、ブラウザのバージョン更新に依存しない能動的は処理を実現することができます。
[1]webdriver-managerパッケージをインストール
$ pip install webdriver-manager
[2]実装修正
以下に示すように、「before」だった処理を「after」の処理に置き換えてください。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://google.com')
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://google.com')
[3]実行確認
実行後、Chromeのバージョンと webdriver
のバージョンが一致していることを確認できます。
# 実行
$ python main.py
---
====== WebDriver manager ======
Current google-chrome version is 98.0.4758
Get LATEST chromedriver version for 98.0.4758 google-chrome
Trying to download new driver from https://chromedriver.storage.googleapis.com/98.0.4758.102/chromedriver_mac64.zip
Driver has been saved in cache [/Users/username/.wdm/drivers/chromedriver/mac64/98.0.4758.102]
/workspace/main.py:28: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Chrome(ChromeDriverManager().install())
□ 最後に
スクレイピングやクローリングは作業の自動化において代表的な手段の 1つです。
開発したツールをユーザーに配布して使用していただく際、ブラウザの更新がある度に不具合改修として対応していませんでしたか?
本記事で説明した対応を行えば保守やメンテナンスなども容易になりますので、是非、この機会に導入してみてはいかがでしょうか。
はい、「開発したツールをユーザーへ配布」というワードが出てきたので、ここで宣伝をねじ込みたいと思います。
玄人級の方は既にご存知だとは思いますが、初学者の方は必見です。
これまで開発した Pythonスクリプトをユーザーへ配布する際、スクリプトファイル一式を譲渡していませんでしたか?
ユーザーが使用する PC(OS)に応じて、Pythonスクリプトを実行ファイルに変換することができます。
comment 📝