見出し画像

新時代のMac開発!M2 MacでDocker+Selenium+Pythonを使いこなす完全スタートアップ



背景

  • 久しぶりにデータサイエンス勉強するにあたり、競馬AI作りてーってなった

  • M2 MacにDockerはインストール済みだし、サクッとSelenium環境作ってスクレイピングしたろ!ってなったがどうやらM2環境では癖があるらしい

  • 色々彷徨ってようやくDocker+Selenium環境作れたのでその備忘録。

  • ※タイトルはChatGPTに考えてもらいました。。。

前提

  • OS

    • Apple M2 arm64 

    • Ventura: 13.2.1

    • メモリ: 8GB

  • Docker ※インストール済み

    • Version: 20.10.17

  • Visual Studio Code ※インストール済み

    • Version: 1.71.2

Docker+Selenium+Python環境の概要

今回作成する環境概要は以下

ローカルPCにPythonコンテナSeleniumコンテナの2つを作成する。

Pythonコンテナ

  • Pythonをインストールしたコンテナ。

  • Seleniumと他必要モジュールをインストールしている。

  • .pyファイルはこちらに作成し、Seleniumサーバーとchromeを操作する。

Seleniumコンテナ

  • Seleniumサーバー、WebDriver、Chromeがインストールされたコンテナ。

  • arm64の場合、Seleniarm/standalone-chromiumイメージを用いる必要がある!!(ここが詰まったポイント!かつ重要ポイント!)


環境構築手順

ディレクトリ構成

  • 下記のようなディレクトリを作成する。

PythonSelenium
├── docker-compose.yml
├── py_context
│   ├── Dockerfile
│   └── requirements.txt
└── work
    └── test.py

ソースコード

各ソースコードは以下

docker-compose.yml

version: '3'

services:
  selenium:               # selenium container
    image: seleniarm/standalone-chromium:latest # docker hubのseleniarmイメージ
    shm_size: 2gb         # ホストとメモリを共有するために設定
    ports:
      - 4444:4444         # selenium sever port
      - 7900:7900         # 実行中のChromeを確認するVNC用port
  
  python:                 # python container
    build: ./py_context   # python3のbuild contextを指定
    volumes: 
      - ./work:/work      # ローカルの"./work"とコンテナの"/work"をバインド
    tty: true             # ターミナル入力を受け付ける
    depends_on:           # seleniumコンテナの後で起動させるように指定
      - selenium

Dockerfile

FROM python:latest            
RUN apt-get update && \       
    apt-get install -y \      
    build-essential \
    cmake \
    git \
    sudo \
    wget \
    vim
RUN pip install --upgrade pip                
COPY ./requirements.txt /requirements.txt    
RUN pip install -r /requirements.txt         
WORKDIR /work
CMD ["/bin/bash"] 

requirements.txt

requests
selenium
BeautifulSoup4
pandas

test.py

from selenium import webdriver
import time
options = webdriver.ChromeOptions()
driver = webdriver.Remote(
             command_executor = 'http://selenium:4444/wd/hub',
             options = options
             )

driver.implicitly_wait(10)

url = 'https://www.jra.go.jp/' # テストでアクセスするURLを指定
driver.get(url)
print(driver)

time.sleep(3)
driver.save_screenshot('test.png') # アクセスした先でスクリーンショットを取得
driver.quit()

実行

  • docker-composeを実行。

cd PythonSelenium
docker-compose build
docker-compoes up -d                 # detouched mode option
docker-compose exec python bash      # 起動したpythonコンテナに入る 
  • コンテナに入った後、test.pyを実行

python test.py

JRA日本中央競馬のTOPページのスクショが取得できていれば成功!!

まとめ

  • M2 macでDocker+Selenium環境を作成するにはSeleniarm/standalone-chromiumを使う必要がある。

  • 私が色々迷った原因はググって出てくる結果がほぼほぼselenium/standalone-chromeを用いた内容となっておりエラーが多発。。。

    • 実際「docker selenium」で検索すると9割が上記の内容。。

    • 「m2 docker selenium」で検索しても???ってなる内容が多かったので備忘録として残しておきました、、

この記事が気に入ったらサポートをしてみませんか?