Chrome Driverとバイナリーのバージョンを一致させるためのDockerfileの書き方
Posted On 2023-07-17
Seleniumでスクレイピングするには、Chrome Driveとバイナリーの両方が必要になりますが、両者のバージョンの一貫性をDockerfile内で保つことにややハマったので自分なりの解決方法を書きます。
はじめに
- Seleniumでスクレイピングするには、Chrome Driverとバイナリー(本体)が必要
- 両者のバージョンは基本的に一致している必要がある
- Driverはバージョンにあわせて公開してある
- Google Chromeのバイナリーは最新バージョンしか公開していない
- 両者のバージョン同期は、落としたバイナリーを見れば可能だが、それを自動的にDockerfile内でやる方法はないだろうか? というのがこの記事の目的
結論
Chrome DriverのDLを最新のバージョンになるように工夫する。具体的には以下の通り
Chrome Dirverの最新バージョンを取得するAPI
Chrome Driverの最新バージョンは以下のURLで取得でき、文字列として返ってきます。
https://chromedriver.storage.googleapis.com/LATEST_RELEASE
例えば、CURLで叩いてみると、
このようになるので、wgetの中で展開すれば最新版が落ちてくるという仕組み。ただし、Google Chromeのバージョンアップと、Chrome Driverのバージョンアップは必ずしも連動はしていないので、ズレることがあるというのが問題点。
Google Chromeではなく、Chromiumのバイナリを使うという方法もあるが、ここでは割愛。
サンプルコード
以下のようなディレクトリ構成にする
+ src
- app.py
+ docker-compose.yaml
+ Dockerfile
+ requirements.txt
Dockerfile
※最小限の構成で、Docker上でSeleniumを動かすための環境しか作っていない
requirements.txt
docker-compose.yaml
ローカルのソースディレクトリをマウントしているほか、擬似端末を入れています。
app.py
試しにYahoo Japanのトップトピックを抜いてprintしています。
実行・結果
ビルドと実行はいつもの通りで、
別ウィンドウ(WSL)からコンテナをアタッチしてPythonコードを実行させます。
コンテナ消したいときはdocker-compose downで。
結論
とりあえずこれで使えるから良さそう(バージョンをハードコーディングするのもどうかなと思ったので)
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー