selenium-grid-hubを使ってdocker上でスクレイピングする環境を整える話

Posted by jolantern on Thursday, December 7, 2017

スクレイピングアドベントカレンダー、8日目の記事です。

スクレイピング環境の構築について

スクレイピングは便利な技術ですが、その環境構築は少し面倒な場合があります。例えばheadlessに動作させるためにxvfcを入れるか、最近はHeadless Chromeを入れる場合もあるでしょう。 スクレイピングをしたいと思う動機は色々あると思いますが、手元の環境でちょっとした情報収集のためにスクレイピングをするならともかく、何か本番用のサーバなどで動かす場合などはいちいち環境を合わせる必要があって面倒です。 筆者もそのような機会があり、dockerを使えたら楽なのになあと考えたのでした。

最初に構築した環境

この節は解決に至ってないので読み飛ばしていいです。ただの苦労話なので。 最初はrubyのdockerイメージでコンテナを作ってchrome、xvfcなどをインストールをインストールして使う、というのを考えていました。 しかし、dockerコンテナを使って何かサービスを構築するような場合は1コンテナ1サービスが原則でしょう。これではrubyコンテナの仕事量が多いですね。ついでに、dockerイメージをビルドするのにすごく時間がかかってしまいます。Gemfileを書き換えるたびにビルドしたり依存パッケージをインストールしようとするたびに長い時間待つのは気が引けます。 そこで色々調べていると selenium-grid-hub なるものがあることを知りました。

解決した環境

このhubと呼ばれるものは、実行されるべきテストと、テストが実行されるべきブラウザを中継するものです。hubはあくまで情報を仲介するもののようですね。したがって、コンテナ構造は下記の通りに分かれます。

じゃあどうやるんだよ?という話ですがこれは僕が文章を書くより下記リポジトリを見てもらったほうが早いと思います。

j-o-lantern0422/selenium-hub-compose: selenium-hubつかってスクレイピングする記事用のリポジトリ

それっぽい環境を作ってみました。 docker-compose up -d --build とすれば先程の図のような環境が立ち上がります。redisとかそういうのは必要に応じて追加してください。 サンプルコードの sample.rbdocker-compose exec app bundle exec ruby sample.rb とすれば実行されます。 内容は簡単に説明するとGoogleでネコと検索したあとChromeDriverのダウンロードページに飛んで、ファイルのダウンロードダイヤログボックスを表示せずにダウンロードします。特に意味は無いですが、やりがちなやつです。 Downloadsフォルダの中にダウンロードしたChromeDriverが入っていると思います。

ちなみに、スクレイピングするコードを書いていると、ブラウザを実際に見ながら書きたくなることありますよね。screenshotでもいいですが、そういうときはVNCでコンテナに接続できます。

パスワードはデフォルトで secret となっています。便利ですね。 初めてのアドベントカレンダーでこんな感じで良いのかな〜と思いつつ書いてみました。お役に立てれば幸いです。