9
5

M1MacのDockerでSelenium使う方法(&使いたくてハマった話😵‍💫)

Last updated at Posted at 2023-10-23

DockerでSeleniumを使いたい!

「PythonでWebページ解析したいときにはSeleniumとBeautifulSoupを使うのが有名なんですね(?)」っていうレベル感かつ「Dockerもしっかり理解していない」私ですが、「Seleniumちょっとサクッと試してみるか、ライブラリimportすればすぐ使えるんでしょ😙?とりあえずDockerで動かしたいな。」くらいの感じで試したら、全くサクッとできませんでした...

解決策というほどでもありませんが、解決策とハマった内容の共有です!

※ 上記のようなレベル感なので、以下、間違い含んでいたり他にも解決策があるものと思われますが、ご容赦ください🙇‍♂️

※2023-11-02 追記
以下の記事では「なぜM1 MacのDockerでSeleniumが動かないのか」が、詳細にまとめていただいていたので、参考にリンク貼らせていただきます!

解決策: docker-seleniarmのイメージを利用する!

解決策は以下のとおりです!
Selenium公式のDockerイメージからForkされたARMチップ向けのイメージ(下記リンク)を利用すれば、サクッと(?)動かすことができます!
※まだ実験中イメージのようです。

Docker関連のファイル

VSCodeのDev Containerを使う前提で以下3つを用意しました。
SeleniumサーバーとPython環境の2つのコンテナが立ち上がります。
Python3.10でPoetryがインストールされたコンテナです。

  • devcontainer.json
  • docker-compose.yaml
  • Dockerfile
devcontainer.json
{
	"name": "seleniarm-poetry",
	"dockerComposeFile": "docker-compose.yml",
	"service": "app",
	"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
	"customizations": {
	  "vscode": {
		"extensions":["ms-python.python", "njpwerner.autodocstring"]
	  }
	}
}
docker-compose.yaml
version: '3'
services:
  selenium:
    container_name: seleniarm
    image: seleniarm/standalone-chromium:latest
    ports:
      - 4444:4444
    shm_size: "2gb"
  app:
    container_name: poetry-for-seleniarm
    build:
      dockerfile: .
    volumes:
      - ../..:/workspaces:cached
    environment:
      SELENIUM_URL: http://selenium:4444/wd/hub # SELENIUM_URLを環境変数として設定
    tty: true
    depends_on:
      - selenium
Dockerfile
FROM mcr.microsoft.com/devcontainers/base:jammy

ARG DEBIAN_FRONTEND=noninteractive
ARG USER=vscode

RUN DEBIAN_FRONTEND=noninteractive \
    && apt-get update \ 
    && apt-get install -y build-essential --no-install-recommends make \
        ca-certificates \
        git \
        libssl-dev \
        zlib1g-dev \
        libbz2-dev \
        libreadline-dev \
        libsqlite3-dev \
        wget \
        curl \
        llvm \
        libncurses5-dev \
        xz-utils \
        tk-dev \
        libxml2-dev \
        libxmlsec1-dev \
        libffi-dev \
        liblzma-dev

# Python and poetry installation
USER $USER
ARG HOME="/home/$USER"
ARG PYTHON_VERSION=3.10
# ARG PYTHON_VERSION=3.10

ENV PYENV_ROOT="${HOME}/.pyenv"
ENV PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${HOME}/.local/bin:$PATH"

RUN echo "done 0" \
    && curl https://pyenv.run | bash \
    && echo "done 1" \
    && pyenv install ${PYTHON_VERSION} \
    && echo "done 2" \
    && pyenv global ${PYTHON_VERSION} \
    && echo "done 3" \
    && curl -sSL https://install.python-poetry.org | python3 - \
    && poetry config virtualenvs.in-project true

※上記Dockerfileは以下のpython3-poetry-pyenvのdevcontainerテンプレをそのまま利用しています。
https://github.com/Standard-IO/devcontainers-templates

使い方イメージ

ざっくり利用方法のイメージは以下のような感じです!

test.py
from selenium import webdriver
from bs4 import BeautifulSoup
import os
import time


# ブラウザの設定
options = webdriver.ChromeOptions()
driver = webdriver.Remote(
    command_executor=os.environ["SELENIUM_URL"], # 環境変数のSELENIUM_URLを読み込む
    options=options,
)

# ブラウザでURLにアクセスし、レンダリングを待機してからHTMLを取得
driver.get('解析対象のURL')
time.sleep(5)
html = driver.page_source

# BeautifulSoupを使用してHTMLを解析
soup = BeautifulSoup(html, "html.parser")

# 解析内容 〜〜〜〜〜

driver.quit()

ハマった話

ここからは蛇足です!失敗した流れです。
前述の通り、知識不足故に間違いあるかもしれませんので、生暖かい目でよろしくお願いします!

DockerにChromeをインストールしてSeleniumを使う

まず始めに試みたのが、「DockerにChromeをインストールしてSeleniumを使う」です。
しかし、Chromeのインストールがうまくいかないではありませんか!
(間違っているかもですが)「ARMチップLinux用のChromeが配布されていない」からという結論に至りました。

Dockerのプラットフォームを指定してコンテナを起動すればいいのかなとplatform: linux/x86_64とか --platform=linux/amd64あたりを試したがだめでした。

docker-seleniumを利用する

Seleniumが公式で配布しているDockerイメージがあることに気がついたのでそちらを利用することにしました。

まずは、何も考えずにコンテナを立ち上げようとしましたが、Seleniumのコンテナが立ち上がりませんでした。
理由はChromeの時とおなじでプラットフォームがあっていないかららしい。

そこで、docker-compose.yamlでplatform: linux/x86_64を指定トライしたところ、無事にコンテナが立ち上がりました!
しかし、いざ、コードを実行しようとするとエラーが発生してだめでした。
こちらも、恐らくプラットフォーム問題なのだと思います。

docker-seleniumに気がつく

もう一度、docker-seleniumのREADMEをちゃんと読むことにしました。

そうすると、以下の通りARM用の案内があるではありませんか!(始めにREADMEしっかり読むの大事😭)

早速こちらで案内されているdocker-seleniarmを利用することで解決しました。

振り返り

「公式ドキュメント読むべし」とよく言われますが、公式ドキュメントやREADMEを読むのが、急がば回れの近道かもしれないなと思った次第です。

参考にさせていただいた記事

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5