今日、いつも使っているPythonのスクレイピングツールを起動したら、突然エラーが出て動かなくなってしまいました。昨日までは普通に動いていたのに……。
というわけで、備忘録として、原因と解決策(将来を見越したコードの書き方)をまとめておきます。
エラーの内容
SessionNotCreatedException: Message: session not created:
This version of ChromeDriver only supports Chrome version 145
Current browser version is 144.0.7559.97
「ChromeDriverはバージョン145用だけど、お前のPCのChromeは144だぞ」 と言われています。
原因:リリースのタイムラグ
私が使っているライブラリ undetected_chromedriver は、起動時に「ネット上の最新のドライバー(145)」を自動でダウンロードしてきます。しかし、私のPCのChromeブラウザにはまだアップデートが配信されておらず、「144」のままでした。
※最新バージョンチェック(https://googlechromelabs.github.io/chrome-for-testing/#stable)
- ツール: 最新の145を使おうとする(仕事が早い)
- PC本体: まだ144のまま(更新が追いついてない)
この「バージョンの食い違い」が原因でした。
ハマったポイント
実は undetected_chromedriver は、起動するたびに「あ、古いドライバー使ってるね? 最新版(145)に書き換えてあげるよ!」というお節介機能が働くため、手動でファイルを戻しても無駄だったのです。
解決策:コード側でバージョンを指定する
ライブラリの自動更新を一時的に無視して、「強制的にバージョン144を使え」と命令する必要がありました。
uc.Chrome() のオプションに version_main を追加すれば解決します。
# 修正前
driver = uc.Chrome(options=opt)# 修正後(144を強制指定)
driver = uc.Chrome(options=opt, version_main=144)
これで、勝手に145に更新されることなく、無事に起動するようになりました。
将来のための「スイッチ式」コード
ただし、ずっと「144固定」にしておくと、将来自分のPCのChromeが「145」や「146」に上がった時に、今度は逆に「古すぎるぞ」と怒られてしまいます。
そこで、「通常モード(自動)」と「緊急モード(固定)」を簡単に切り替えられるように、コードを以下のように書き換えました。
# =================================================================
# ★Chromeドライバーのバージョン設定 (トラブル対策用スイッチ)
# =================================================================
# PCのChromeとドライバーのバージョンが合わずエラーになる時は、
# 下の【B】を有効にしてください。普段は【A】を使います。# 【A】通常モード (自動取得)
# ※Chromeが正常に更新されているならこちらを使う(将来はこちらに戻す)
# d = uc.Chrome(options=opt)# 【B】固定モード (バージョン指定)
# ※「Driverだけ先行して、本体が古い」という食い違いエラーが出た時の緊急用
d = uc.Chrome(options=opt, version_main=144)
# =================================================================
これで、PCのChromeがアップデートされたら # を付け替えて【A】に戻すだけで済みます。
まとめ
- undetected_chromedriver は最新版を勝手に拾ってくる。
- Chromeのメジャーアップデート直後は、PCの更新が追いつかずエラーになりやすい。
- version_main 引数を使えば、一時的にバージョンを固定できる。
同じエラーで困っている方の参考になれば幸いです。