【スクレイピング】DockerコンテナにSeleniumをインストールしてブラウザ操作

前書き

前回Google Colabでchromium-chromedriverとSeleniumを使って、Yahoo! Newsのコメントをスクレイピングしました。
melheaven.hatenadiary.jp

環境構築

seleniumとはWebブラウザの自動操作化を実現させるためのフレームワークです。
Seleniumを介してChromeを操作するための環境構築をDockerで実現します。

Chromeインストール

以下のようなエラーが出た方はChromeがインストールされていない or PATHが設定されていない人です。

WebDriverException: unknown error: cannot find Chrome binary

まずはChromeのインストールを行います。
ここで「依存型パッケージが入ってない」的なエラーをされた方は以下の記事を参考にしてください。

qiita.com

google-chromeの場所を訪ねた時に/usr/bin/google-chromeに入っているとOKです。
バージョンは今後重要な情報になってきますので、番号をメモしてください。

$ cd /tmp
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo apt install  --fix-broken ./google-chrome-stable_current_amd64.deb
$ which google-chrome
/usr/bin/google-chrome
$ google-chrome --version
Google Chrome 87.0.4280.88

yusuke.blog

chromedriverインストール

以下のようなエラーが出た方はこれからインストールするchromedriverのバージョンとChromeのバージョンが一致していない人です。

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 87

以下のサイトからChrome Driverをインストールしますが、今回はCurlでバージョンを指定してファイルを落としてきます。
sites.google.com

だいたい以下の文字列に各自のChromeのバージョンを代入しますが、chromedriverに指定したいバージョンが存在するのか上記のサイトで確認してください。

”https://chromedriver.storage.googleapis.com/(Chromeのバージョン)/chromedriver_linux64.zip”

curlコマンドでzipファイルをダウンロードした後、解凍します。
chromedriverの位置を/usr/local/bin/に落とすことにより、PATH設定が完了します。
バージョンがChromeのバージョンと一致しているか確認してください。
今回の例では"87.0.4280.88"で一致しています。

$ cd /tmp
$ curl -O https://chromedriver.storage.googleapis.com/87.0.4280.88/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip
$ mv chromedriver /usr/local/bin/
$ which chromedriver
/usr/local/bin/chromedriver
$ chromedriver -v
ChromeDriver 87.0.4280.88
$ chromedriver
ChromeDriver was started successfully.

以下、参考にした記事です。
qiita.com

その他モジュールのインストール

以下のエラーが出る場合、まだ足りていません。

Message: Service chromedriver unexpectedly exited. Status code was: 127

libglib・libnss・libgconf・libfontconfigといったモジュールが存在しておらず、chromedriver動作時にエラーが吐いているのではと推測します。
以下の記事を参考にしましたが、それぞれ環境が異なります。

stackoverflow.com

www.it-swarm-ja.tech


インポート可能なlibglibを探して列挙してくれます。
自分の場合はlibglib2.0-0を選択してダウンロードしました。
libnss・libgconf・libfontconfigの場合でも同様にコマンドを実行しますが、Dockerの場合、libglib2.0-0・libgconf-2-4・libfontconfig1・libnss3をインストールします。
インストールできない場合はlibglib2.0-devなど、末尾にdevが付いているのを選択してみてください。

$ apt search libglib

libglib2.0-0/stable,now 2.58.3-2+deb10u2 amd64 [installed]
  GLib library of C routines

libglib2.0-bin/stable,now 2.58.3-2+deb10u2 amd64 [installed,automatic]
  Programs for the GLib library

スクレイピングまでの道のり

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver',options=options)

終わりに

自分の場合、上記の方法でDockerでもSeleniumChrome-driverを使用できました。
これらの処理を本当はDockerfileに書き込み、環境構築時に自動化させる必要がありそうです。