Dockerで python + selenium 実行環境を構築してみた

2024/07/15

Docker
Python
selenium

Dockerで python + selenium 実行環境を構築したので手順をまとめました。

seleniumとは

Seleniumは、Webアプリケーションのテスト自動化やブラウザ操作の自動化を行うためのツールです。
Google Chrome、Mozilla Firefox、Safari、Microsoft Edgeなど主要なブラウザに対応しています。
各ブラウザに対するWebDriverをインストールしてブラウザを起動し、ウェブページにアクセスしたり、要素を操作したりします。

Docker環境を構築する

スクレイピングを実行する開発環境をDockerで構築します。

Dockerfile

Dockerfile
FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
  localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less \
  && pip install --upgrade pip \
  && pip install --upgrade setuptools

# pip で requirements.txt に指定されているパッケージを追加する
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

docker-compose.yml

docker-compose.yml
version: "3"
services:
  # Selenium サーバを起動するコンテナ
  selenium:
    container_name: selenium-chrome
    # 通常の環境では、以下のイメージを使います。
    # image: selenium/standalone-chrome
    # M1 Mac など ARM で動作する環境では、以下のイメージを使います。
    image: seleniarm/standalone-chromium
    ports:
      # Selenium サーバに接続するポート
      - "4444:4444"
      # VNC で接続するポート
      - "5900:5900"
      # Selenium サーバのログを出力するポート
      - "7900:7900"
    # コンテナが使用するメモリの上限を設定
    shm_size: "4gb"
  
  # Web スクレイピングを実行するコンテナ
  app:
    container_name: app
    build: .
    working_dir: /app
    volumes:
      - ./app:/app
    tty: true

requirements.txt

requirements.txt
chromedriver_binary==125.0.6422.60.0
requests==2.32.2
selenium==4.19.0

スクレイピングを実行する

今回はサンプルとして、弊社のホームページからメンバー5人の名前をスクレイピングするコードを記述します。

scraping.py
from selenium import webdriver
from selenium.webdriver.common.by import By

def main():
    # スクレイピング対象のURLを設定
    url = 'https://corporate.irori.dev/'
    
    # Selenium WebDriverのインスタンスを作成
    # Remote WebDriverを使用して、指定したホスト(selenium:4444)で実行
    browser = webdriver.Remote(
        command_executor='http://selenium:4444/wd/hub',  # Selenium GridのURL
        options=webdriver.ChromeOptions()  # Chromeのオプションを設定(デフォルトの設定を使用)
    )

    # 指定したURLをブラウザで開く
    browser.get(url)

    for i in range(1, 6):
        # XPathを使って、ページ内の指定した要素(i番目のメンバーのh3要素)を検索
        member = browser.find_element(By.XPATH, f'/html/body/div/div[2]/main/section[5]/div[2]/span[{i}]/h3')
        
        # 検索した要素のテキストを取得して出力
        print(member.text)

    # ブラウザを終了し、リソースを解放
    browser.quit()

if __name__ == '__main__':
    main()

コンテナを起動して、scraping.pyを実行すると5人のメンバーの名前を取得して出力してくれます。

root@21d19cc1c2d0:# python sample.py
Chinami
Kenji
Keitaro
Naoki
Kazuki

今回はここまでです。