サーバでスクレイピングをする時に一番困る問題。
それは、ChromeもしくはFirefoxをインストールしなければならないことです。
自分の好きに使える個人的なサーバでもできるだけ汚したくないものです。
PhantomJS を使っていた時期もありましたが、もう奨励されていないということで僕は悩みました。
サーバにブラウザをインストールするかどうかを、です。
しかし、それも大した問題ではないのです。そう、Docker ならね。
ゴール
サーバで cron からスクレイピング用実行ファイルを実行させることが最終ゴールになります。
cron -> Docker run で scraping.py(仮)を実行し、実行後はコンテナ終了。
サーバOSは debian です。
Docker のインストール
これを見てね。(debian)
Debian stretch に Docker を入れてみた
Dockerfile
今回作成した Dockerfile はこちら
FROM python:3
RUN apt-get update && apt-get install -y unzip
# Japanese Localization
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# google-chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add && \
echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list && \
apt-get update && \
apt-get install -y google-chrome-stable
# ChromeDriver
ADD https://chromedriver.storage.googleapis.com/77.0.3865.10/chromedriver_linux64.zip /opt/chrome/
RUN cd /opt/chrome/ && \
unzip chromedriver_linux64.zip
# python package
RUN pip install selenium && \
pip install bs4 && \
pip install oauth2client
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/chrome
python package は必要なパッケージを指定しておけば、一緒にインストールしてくれます。
ChromeDriver は インストールされるGoogle-Chrome のバージョンと合ったものを指定して下さい。
ここを見ながらバージョンを指定して下さい。
イメージのビルド
新しいイメージを作成します。
Dockerfile が置いてあるディレクトリに移動し、実行します。
sudo docker build -t scraping .
イメージが作成出来ているか確認してみます。
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
scraping latest xxxxxxxxxxxx 49 seconds ago 1.42GB
python 3 xxxxxxxxxxxx 12 hours ago 932MB
二つ作成されていれば成功ですね。
(None)などと表示されていた場合は失敗しています。
一度イメージを削除して DockerFile を見直してみてください。
コンテナ起動して bash で確認
まずはきちんと scraping.py(仮) が実行できるか bash でコンテナ内にはいって実行してみます。
bash で操作できるコンテナを起動してみます。
$ sudo docker run -it --rm -v $(pwd):/root scraping bash
root@xxxxxxxxxxxx:/#
docker 内の bash が起動します。
/root の下にカレントディレクトリが見えるようになります。
scraping.py(仮)を実行してみてうまくいけば確認完了です。
(カレントディレクトリに scraping.py が入っている場合)
root@xxxxxxxxxxxx:/# cd ~/root/
root@xxxxxxxxxxxx:~# scraping.py
成功したら、コンテナから抜けます。
root@xxxxxxxxxxxx:~# exit
~$
cronに登録
Docker は root で実行する設定になっているので、cron もルートで実行するものを使いました。
もっとうまくできるよってあれば教えていただきたいです。
~$ sudo crontab -e
7 7 * * * docker run --rm -v /home/***/***/***:/root scraping bash -c "python /root/scraping.py"
こんな感じで。ディレクトリとか実行ファイルとか適時に変えてもらえればいいかとおもいます。
「-it」をはずすことで、勝手に実行して勝手に終了します。
※「/home/***/***/***」 : 実行ファイルがあるディレクトリを指定
さいごに
このイメージさえ用意してあれば、色々なスクレイピングを実行することが可能です。
低スペックなサーバでも結構軽いので助かりますね。
コメント
[…] Docker 内で Chrome とSelenium を使ったスクレイピング実行環境を構築してみた […]