ホームページ制作を大阪で安く頼むならプロットハブ!

ホームページ制作を大阪で安く頼むならプロットハブ!
毎月5社限定企画実施中

プロットハブ技術ブログ

【コピペOK】dockerにselenium(Chrome)を入れてみた

Ryota Ono

Ryota Ono

2024/9/11

普段pythonでスクレイピングするときはローカルでそのまま動かすかvenvで動かすことが多いのですが、今回はdockerでseleniumを動かしてみました。
やってみると特別難しいわけではなかったので、その手順をまとめておきます。
コピペで使えるようにソースコードも全て共有するので、ぜひお試しください。
今回はDjangoでの使用を想定していますが、他のフレームワークでも同じように使えると思います。

最終的なディレクトリ構成

.
├── README.md
├── docker
│    └── app
│    ├── Dockerfile
│    └── requirements.txt
├── docker-compose.yml
└── src
    ├── app
    ├── config
    └── manage.py

1. Dockerfileを作成する

# Dockerfile for backend
FROM python:3.9-slim

# Install necessary packages
RUN apt-get update && apt-get install -y \
    build-essential \
    libssl-dev \
    libffi-dev \
    libmariadb-dev \
    curl \
    unzip \
    gnupg \
    chromium \
    chromium-driver \
    pkg-config

# Set environment variables
ENV CHROME_BIN=/usr/bin/chromium
ENV CHROME_DRIVER=/usr/bin/chromedriver
ENV PATH=$PATH:/usr/bin

# Set work directory
WORKDIR /app

# Copy requirements file
COPY requirements.txt requirements.txt

# Install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

# Copy project files
COPY . .

# Expose port
EXPOSE 8000

# # Run the application
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

まずはDockerfileを作成します。
ここではpython3.9をベースにして、chromiumとchromedriverをインストールしています。  
requirements.txtは後ほど作成します。

2. docker-compose.ymlを作成する

services:
  db:
    container_name: hoge_db
    image: mysql:8.0
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
    volumes:
      - hoge_db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: hoge_db
      MYSQL_USER: django_user
      MYSQL_PASSWORD: django_password
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  backend:
    container_name: backend
    build:
      context: ./docker/app
    volumes:
      - ./src:/app
    ports:
      - "8000:8000"
    environment:
      - DATABASE_HOST=db
      - DATABASE_NAME=hoge_db
      - DATABASE_USER=django_user
      - DATABASE_PASSWORD=django_password

  chrome:
    container_name: chrome
    image: seleniarm/standalone-chromium:latest
    ports:
      - "4444:4444"
    volumes:
      - /dev/shm:/dev/shm
volumes:
  hoge_db:

次にdocker-compose.ymlを作成します。
ここでは、先ほど作成したDockerfileを使ってbackendコンテナを立ち上げています。
また、seleniumを使うためにchromeコンテナも立ち上げています。
Djangoを使用するためにdbコンテナも立ち上げています。
container_nameは任意の名前に変更してください。

3. requirements.txtを作成する

Django==4.2
mysqlclient
selenium
webdriver-manager
chromedriver-binary==126.0.6478.126
beautifulsoup4

今回はDjangoを使用するため、Djangoとmysqlclientをインストールしています。
chromedriver-binaryは任意のバージョンを指定してください。
最新を選択することをお勧めします。
Chrome for Testing availabilityでバージョンを確認することができます。

4。 Djangoの環境を構築する

docker-compose run backend django-admin startproject config .

今のままだとDjangoのプロジェクトが存在しないのでコンテナを立ち上げてもエラーになってしまうので、Djangoのプロジェクトを作成します。
configは任意の名前に変更してください。

5. コンテナを立ち上げる

docker compose up -d --build

6. コンテナに入る

docker exec -it backend bash

7. Djangoの設定を変更する

# config/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('DATABASE_NAME'),
        'USER': os.environ.get('DATABASE_USER'),
        'PASSWORD': os.environ.get('DATABASE_PASSWORD'),
        'HOST': os.environ.get('DATABASE_HOST'),
        'PORT': '3306',
    }
}
データベースの作成
python manage.py migrate
アプリケーションの作成
python manage.py startapp app
# config/settings.py
INSTALLED_APPS = [
    ...
    'app',
]

8. seleniumを使ってみる

コマンドを作成して、seleniumを使ってみます。
以下をコピペしてください。

# app/management/commands/scrape.py
from django.core.management.base import BaseCommand
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

def create_webdriver_instance(headless=True):
    """
    Selenium WebDriverインスタンスを生成し、設定します。
    """
    # Chromedriverのパスを手動で設定
    chromedriver_path = "/usr/bin/chromedriver"
    service = Service(chromedriver_path)

    # WebDriverのオプション設定
    options = webdriver.ChromeOptions()
    options.add_argument('--disable-gpu')  # GPUを無効にする
    options.add_argument('--no-sandbox')  # サンドボックス無効化
    options.add_argument('--disable-dev-shm-usage')  # /dev/shmパーティションの使用を回避
    headless = True
    if headless:
        options.add_argument('--headless')
        options.add_argument('--window-size=1920,1080')  # ウィンドウサイズを指定
        options.add_argument('--start-maximized')
        options.add_argument('--disable-blink-features=AutomationControlled')  # 自動化検出を無効化
        options.add_argument('--disable-infobars')  # "Chrome is being controlled by automated test software" バーを無効化
        options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')  # User-Agentを設定

    # WebDriverインスタンスの生成
    driver = webdriver.Chrome(service=service, options=options)

    return driver

class Command(BaseCommand):
    def handle(self, *args, **options):
        driver = create_webdriver_instance()
        driver.get('https://www.google.com/')
        print(driver.title)
        driver.quit()
コマンドを実行
docker exec -it backend bash
python manage.py scrape

「Google」が表示されれば成功です。

まとめ

以上でdockerにselenium(Chrome)を入れてみる手順をまとめてみました。
dockerで作成するとECSなどにデプロイする際にも楽になるので、ぜひお試しください。
弊社ではデータ収集などの依頼も受け付けておりますので、お気軽にお問い合わせください。

プロットハブはソフトウェア開発を
支援しています。
ご興味のある方はぜひお気軽に
ご相談ください。

一覧ページに戻る

全カテゴリ一覧

全タグ一覧

関連記事

コメント

コメントを残す

コメントが承認されると公開されます。※の入力欄は必須項目です

ホームページ制作が毎月5社限定5万5千円から!ご依頼の方はコチラ!