普段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などにデプロイする際にも楽になるので、ぜひお試しください。
弊社ではデータ収集などの依頼も受け付けておりますので、お気軽にお問い合わせください。
コメント