強欲で謙虚なツボツボ

趣味の読書の書の方

【selenium + headless-chrome + docker】動かしてみる

概要

webのスクレイピングなどの自動操作でchromeseleniumで動かそうとしたけど、chromeのバージョンに合わせてドライバーを選ばないといけないからPCによって動かなかったりchromeの更新で動かなかくなったりする。
Dockerを使えばイメージを作成した時から環境が変わることもなくて、そういう面倒なことを解消できそうなのでやってみることにした。
サーバや仮想環境内でchromeとか動かせるのかと思っていたけど、調べてみるとheadless-chromeというのでブラウザーのUIを出さずに実行できるらしい。

developers.google.com

 

やったこと

  • Docker Desktop for Mac をインストール
  • Dockerfileを作成
  • コンテナ内で実行するpythonファイルを作成

以下の記事を参考に(コピペ)して起動したdockerのコンテナ内でchromeを実行する。
記事ではubuntu16.04だったが18.04でやった。
あと、いろいろエラーが出たので対応した。

qiita.com

 

Docker Desktop for Macをインストール

チップがintel製かApple製かで間違えないように。
「このMacについて」のプロセッサを見るとintelとか書いてある。
最近のだとApple製のM1チップというのが使われているらしい。

Install Docker Desktop on Mac | Docker Documentation

 

Dockerfileを作成(エラー対応)

適当なディレクトリを作成してDockerfileを記述。
まずは、上であげた参考記事のDockerfileをそのまま使う

From ubuntu18.0.4
# ... 略 ...
RUN groupadd -g 1000 developer && \
    useradd  -g      developer -G sudo -m -s /bin/bash 作成したいユーザー名 && \
    echo '作成したいユーザー名:そのパスワード' | chpasswd
# ... 略 ...
User 作成したいユーザー名
# ... 略 ...

dockerのイメージを作成するとエラーが出た。

docker build -t 任意のイメージ名 .

f:id:taopo:20210818134238p:plain

エラーログの上の方

f:id:taopo:20210818134352p:plain

エラーログの最後

どうやらpythonのdistutilsというモジュールがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y python3 curl python3-distutils && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818134830p:plain

エラーログの最後

どうやらwgetというのがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y wget && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818135100p:plain

エラーログの最後

どうやらunzipというのがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y unzip && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818135234p:plain

エラーログの最後

どうやらchromeをインストールするのに必要なパッケージが足りていないらしいのでDockerfileに追記。

    # touch /etc/default/google-chrome && \ の上
    apt-get install -y libatk-bridge2.2-0 libatspi2.2-0 libgbm1 libgtk-3-0 libxkbcommon0 && \

再度docker buildをするとイメージ生成が成功した。

f:id:taopo:20210818135553p:plain

dockerイメージの生成に成功

最終的なDockerfile。不要なパッケージのインストールもあるかもしれない

FROM ubuntu:18.04

# Install.
RUN \
  apt-get update && \
  apt-get install -y wget && \
  apt-get install -y unzip && \
  apt-get install -y python3 curl python3-distutils && \
  curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
  python3 get-pip.py && \
  pip install --upgrade pip && \
  pip install selenium && \
  pip install beautifulsoup4 && \
  apt-get install -y libfontconfig && \
  mkdir -p /home/root/src && cd $_ && \
  wget -q -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip && \
  unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ && \
  apt-get install -y libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils && \
  apt-get install -y libatk-bridge2.0-0 libatspi2.0-0 libgbm1 libgtk-3-0 libxkbcommon0 && \
  touch /etc/default/google-chrome && \
  wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
  dpkg -i google-chrome-stable_current_amd64.deb && \
  apt-get install -y fonts-migmix

RUN apt-get install -y sudo

# add sudo user
RUN groupadd -g 1000 developer && \
    useradd  -g      developer -G sudo -m -s /bin/bash 作成したいユーザー名 && \
    echo '作成したいユーザー名:作成したいパスワード' | chpasswd

RUN echo 'Defaults visiblepw'          >> /etc/sudoers
RUN echo '作成したいユーザー名 ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# Set japanese
RUN apt-get install -y language-pack-ja-base language-pack-ja
RUN locale-gen ja_JP.UTF-8

# Set environment variables.
ENV LANG ja_JP.UTF-8
ENV PYTHONIOENCODIND utf_8

USER 作成したいユーザー名

# Define default command.
CMD ["/bin/bash"]

 

コンテナ内で実行するpythonファイルを作成

適当にmain.pyというのを作る。

f:id:taopo:20210818140039p:plain

ファイルの場所(どこでもいい)
# main.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.google.com')
print(driver.title)

これをdockerコンテナ内で実行するとhttps://www.google.comのタイトルタグ、つまりGoogleと表示されるはず。

さっき作成したイメージからコンテナを起動。

docker run --privileged -v "Dockerfileを作成したディレクトリのパス:/home/Dockerfileに記述した作成したいユーザー名" -ti 作成したイメージの名前

Dockerfileで作成したユーザー(今回はotam)があって、-vで指定したホスト側のディレクトリがボリュームされている。
そして、pythonファイルを実行するとGoogleと表示されるので正常にselenium + headless-chromeが動作していることがわかる。

f:id:taopo:20210818140718p:plain

main.pyを実行するとGoogleと表示される

 

終わりに

とりあえず良さそうで安心した。
次はログインとかCookieを保存してリクエスト結果を見たりしてみたい。