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
今回はここまでです。