Docker+Pythonを使ってスクレイピング環境を構築する

スクレイピング環境を構築するなら、Dockerを使うのがおすすめ!!

高度なスクレイピング環境を構築しようと思ったら、少なくとも以下の環境構築が必要です。

  • Python(プログラミング環境)
  • Chromeドライバー(ブラウザを操作するためのドライバー)
  • Chrome(ブラウザ)

しかも、それぞれのバージョンを合わせなければならないなど、難易度は高く、構築に数時間かかってしまうこともあります。
そのため、Dockerを使って仮想環境ごと用意してしまうのがおすすめです。

Dockerとは

コンテナという仮想環境を構築できるソフトウェア。
作った仮想環境を簡単に再利用・配布もできる。

https://www.docker.com/why-docker

Dockerをインストールしていない方は、以下のサイトなどを参考に、Dockerの環境を構築してください。

環境構築手順

今回は、特定のサイトに接続して、スクリーンショットを撮ることを目標とします。
ソースコードなどのファイルは下記のように配置します。

Dockerfile

以下の環境を用意するDockerfileを用意します。

  • Python 3.7
  • 作業用ディレクトリ(ソースコードや結果の保存用)
  • selenium(スクレイピング用のpythonライブラリ)
  • chromeドライバー
  • chrome
  • 日本語設定(文字化け防止)
# ベースイメージはpython:3.7
FROM python:3.7

# 環境変数設定
ENV PYTHONIOENCODING utf-8
ENV TZ='Asia/Tokyo'

# workdirの設定
WORKDIR /app

# 作業ディレクトリ作成
RUN mkdir /app/source
RUN mkdir /app/data

# apt-getのアップデートなど
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y apt-utils
RUN pip install --upgrade pip

# 必要なpythonライブラリのインストール
RUN pip install selenium

# Chromeドライバーのダウンロード
RUN wget -q -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# Chromeのインストール
RUN apt-get install -y libgbm1 libappindicator3-1 libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils libfontconfig
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb

# 日本語設定
RUN export LANG=C.UTF-8
RUN export LANGUAGE=en_US:
RUN apt-get install -y fonts-ipafont

# コンテナ起動時に実行するコマンドを設定
CMD [ "python", "source/main.py" ]

docker-compose.yml

今回は使用するコンテナは一つだけなので、コマンドだけでも環境構築は可能なのですが、docker-compose.ymlを使うと、必要なコマンドがぐっと短くなります。
やっていることは、ホストPCのsourceディレクトリとdataディレクトリを、コンテナのディレクトリにそれぞれマウントしているだけです。

version: "3"
services:
  pythonapp:
    container_name: "app"
    build: ./app
    volumes:
      - ./app/source:/app/source
      - ./app/data:/app/data

main.py

実際にスクレイピングを行うコードはこちら。
seleniumというライブラリを使って、指定のurlにアクセス、スクショを撮っています。

from selenium import webdriver
import time

# chromeドライバーを起動する時のオプションを設定
options = webdriver.ChromeOptions()
options.add_argument("--headless")  # ヘッドレスで起動
options.add_argument('--no-sandbox') # 仮想環境下では、sandboxで起動すると失敗するので無効にする
options.add_argument('--disable-gpu') # ヘッドレスモードで起動するときに必要
options.add_argument('--window-size=1280,1024')  # 画面サイズの指定

# chromeドライバーを起動
driver = webdriver.Chrome(options=options)

# googleを開く
driver.get("https://www.google.co.jp/")

# 画面が表示されるまで待つ
time.sleep(3)

# スクリーンショットを撮る
driver.save_screenshot("./data/screenshot.png")

実行

下記のコマンドを実行すれば、必要な環境が構築されたdockerコンテナが起動し、下図のようなスクリーンショットがdataディレクトリ内に保存されるはずです。

実行結果

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です