【selenium + headless-chrome + docker】動かしてみる
概要
webのスクレイピングなどの自動操作でchromeをseleniumで動かそうとしたけど、chromeのバージョンに合わせてドライバーを選ばないといけないからPCによって動かなかったりchromeの更新で動かなかくなったりする。
Dockerを使えばイメージを作成した時から環境が変わることもなくて、そういう面倒なことを解消できそうなのでやってみることにした。
サーバや仮想環境内でchromeとか動かせるのかと思っていたけど、調べてみるとheadless-chromeというのでブラウザーのUIを出さずに実行できるらしい。
やったこと
以下の記事を参考に(コピペ)して起動したdockerのコンテナ内でchromeを実行する。
記事ではubuntu16.04だったが18.04でやった。
あと、いろいろエラーが出たので対応した。
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 任意のイメージ名 .
どうやらpythonのdistutilsというモジュールがないらしいのでDockerfileに追記。
# apt-get update && \ の下 apt-get install -y python3 curl python3-distutils && \
再度docker buildをするとまたエラーが出た。
どうやらwgetというのがないらしいのでDockerfileに追記。
# apt-get update && \ の下 apt-get install -y wget && \
再度docker buildをするとまたエラーが出た。
どうやらunzipというのがないらしいのでDockerfileに追記。
# apt-get update && \ の下 apt-get install -y unzip && \
再度docker buildをするとまたエラーが出た。
どうやら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をするとイメージ生成が成功した。
最終的な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というのを作る。
# 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が動作していることがわかる。