Joifup Blog

DjangoのDockerコンテナ内にChromeとChromeDriverをインストールする

2023-06-04

DjangoDockerスクレイピングChromeDriver

はじめに

PythonのWebフレームワークであるDjangoの処理内でウェブスクレイピングを行いたい場合、SeleniumやChromeDriverが一般的に使われます。しかし、これらをDockerコンテナ上で実行するためには、ChromeとChromeDriverをコンテナ内にインストールする必要があります。

今回は、その設定方法について詳しく解説します。まずは、元々のDockerfileから見ていきましょう。

元々のDockerファイル

FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip && \
    pip install -r requirements.txt
COPY ./django/ /code/

上記は非常にシンプルなDockerfileで、Python 3の環境をベースにして、特定のディレクトリに移動し、必要なPythonパッケージをインストールしています。

しかしここに、SeleniumとChromeDriverを使うための設定を追加する必要があります。

修正後のDockerファイル

以下に修正後のDockerfileを示します。

FROM python:3

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# Google Chromeをインストール
RUN apt-get update && apt-get install -y wget gnupg2 unzip
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
    dpkg -i google-chrome-stable_current_amd64.deb || apt-get -fy install

# ChromeDriverをインストール
RUN CHROMEDRIVER_VERSION='114.0.5735.90' && \
    mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION && \
    curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
    unzip /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSION && \
    rm /tmp/chromedriver_linux64.zip && \
    chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver && \
    ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriver

WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip && \
    pip install -r requirements.txt
COPY ./django/ /code/

それぞれの修正箇所について詳しく説明

Google Chromeのインストール

# Google Chromeをインストール
RUN apt-get update && apt-get install -y wget gnupg2 unzip
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
    dpkg -i google-chrome-stable_current_amd64.deb || apt-get -fy install

この部分ではGoogle Chromeをインストールしています。まず、apt-get updateでパッケージリストを最新化します。次に、apt-get install -y wget gnupg2 unzipで、Chromeをインストールするために必要なパッケージ(wget, gnupg2, unzip)をインストールします。

次に、wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.debでGoogle Chromeの安定版(amd64バージョン)をダウンロードします。ダウンロードした.debファイルをdpkg -iでインストールします。

しかし、このインストールが依存関係の問題で失敗する可能性があります。そのため、|| apt-get -fy installで、失敗した場合には強制的に依存関係を解決しながらインストールを行うようにしています。

ChromeDriverのインストール

# ChromeDriverをインストール
RUN CHROMEDRIVER_VERSION='114.0.5735.90' && \
    mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION && \
    curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
    unzip /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSION && \
    rm /tmp/chromedriver_linux64.zip && \
    chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver && \
    ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriver

ここではChromeDriverのインストールを行っています。まず、CHROMEDRIVER_VERSION='114.0.5735.90'でインストールしたいChromeDriverのバージョンを指定します。

次に、mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSIONで、ダウンロードしたChromeDriverを保存するディレクトリを作成します。

その後、curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zipで指定したバージョンのChromeDriverをダウンロードします。

ダウンロードしたzipファイルをunzip /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSIONで解凍し、解凍したファイルをchmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriverで実行可能にします。

最後に、ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriverで、/usr/local/binにChromeDriverへのシンボリックリンクを作成します。これにより、コンテナ内のどの場所からでもchromedriverコマンドを利用できるようになります。

まとめ

Dockerを利用した環境でSeleniumとChromeDriverを使用するには、Dockerfileを適切に編集する必要があります。具体的には、Google ChromeとChromeDriverのインストールをDockerfileに追記し、それぞれがDockerコンテナ内で適切に動作するように設定します。この設定により、Dockerコンテナ内でスクレイピングを行う際の初期設定を容易にし、また再現性と携帯性を向上させます。