Docker ComposeでSeleniumの環境構築をする方法(APIとSeleniumで連携する)
こんにちは、AIQ株式会社のフロントエンドエンジニアのまさぴょんです!
今回は、Docker ComposeでSeleniumの環境構築をする方法(APIとSeleniumで連携する)について、解説します。
Docker ComposeでSeleniumの環境構築をする
以前、Seleniumを使って、電話番号から会社名を特定する方法・Google検索して情報を取得する方法(Webスクレイピング)について記事にしました。
(Seleniumの説明や、Local環境での環境構築についても、こちらの記事に記載しています)
今回は、localで構築したプログラムをDocker Composeで動かしているBackEnd-APIと連携して使うために、Docker ComposeでSeleniumの環境構築をするSampleプロジェクトを作成したので、その作成手順をご紹介します。
プロジェクトの構成
プロジェクトの構成は、次のとおりです。
tree -L 2 -a
.
├── README.md
├── app
│ ├── dockerfile
│ └── src
└── docker-compose.yml
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: "2gb"
# Web スクレイピングを実行するコンテナ
scraping-app:
container_name: scraping-app
build: ./app
volumes:
- ./app:/opt/app
tty: true
dockerfileの内容
dockerfileの内容
の内容は、次のとおりです。
FROM python:3.8
ENV PYTHONIOENCODING utf-8
WORKDIR /opt/app
RUN pip install selenium
app/src/company_judge.pyの内容
app/src/company_judge.py
の内容は、次のとおりです。
from selenium import webdriver
from selenium.webdriver.common.by import By
import traceback
### 作成・Module ########################################################
# 1. 電話番号(会社の代表番号: 固定電話)から、会社名を特定する
########################################################################
if __name__ == '__main__':
print('seleniumTest Call')
# 電話番号
tell = '050-5581-6910' # 楽天株式会社・Tell
# 検索パラメーター付きの URL
phone_number_search_web_url = f'https://www.jpnumber.com/searchnumber.do?number={tell}'
print('検索パラメーター付きの URL')
print(phone_number_search_web_url)
# webdriver.Remote() で Selenium Container を指定して、接続する。
browser = webdriver.Remote(
command_executor="http://selenium:4444/wd/hub",
options=webdriver.ChromeOptions()
)
# 会社名
result = ''
browser.get(phone_number_search_web_url)
try:
result_element = browser.find_element(By.XPATH, '//*[@id="result-main-right"]/div[2]/table/tbody/tr/td[1]/div/dt[2]/strong/a')
result = result_element.text
except Exception as error:
# traceback.format_exc() で例外の詳細情報を取得する
error_msg: str = traceback.format_exc()
print(error_msg)
# 例外を無視したい場合は、pass を使用する
pass
finally:
# ブラウザを閉じる (エラーが発生しても必ず実行)
browser.quit()
print('--------------------------------------------------------------')
print('電話番号・検索の結果から取得した会社名')
print(result)
ここまでで、Docker ComposeでSeleniumの環境構築をするSampleプロジェクトは完成しました。
この後、実際に動作確認をしてみます。
動作確認をする
- Image の Build と Container の立ち上げを実施します。
docker compose up --build
- テストスクリプト実行環境のコンテナに入ります。
docker exec -it scraping-app /bin/bash
- テストスクリプトを実行します。
python ./src/company_judge.py
実際に動かすと、次のようにLogが表示されるはずです。
M1 Mac など ARM環境の方は、使用するDocker Imageに注意!
Docker Compose にもコメントで書いていますが、M1 Mac など ARM環境の方は、使用するDocker Imageに気をつけてください。
私の環境は、M1 Macですが、selenium/standalone-chrome
というSelenium Docker Imageを使っていたら、Driver info: driver.version: unknown
とエラーが発生しました。。。
調べてみると、M1 Mac など ARM環境の場合は、docker-seleniarm
というARM対応のDocker Imageを使う必要があることが判明しました。
(詳細は、system spec が通らなくなった問題を SeleniARM で解決!をご参照ください。)
docker-seleniarm
のGitHubは、こちらです。
(おまけ)DockerでSeleniumを動かす
今回は、Docker ComposeでSeleniumの環境構築をして、APIと連携させるためのSampleをご紹介しましたが、DockerでSeleniumを動かすバージョンもご紹介します。
1. Docker Image を installする
SeleniumのDocker Imagesの中から使うものを選びます。
今回は、chromiumのDriverを搭載したseleniarm-dockerを利用します。
docker pull seleniarm/standalone-chromium
2. Selenium Cotanier を実行する Ver. Chromium
docker run --rm -it -p 4444:4444 -p 5900:5900 -p 7900:7900 --shm-size 2g seleniarm/standalone-chromium:latest
- 4444, 5900, 7900 の3つのポートを使用します。
3. WebDriver を使ったWebブラウザ操作の実行
- WebDriver を使ったWebブラウザ操作は、 http://localhost:4444 を指定して実施します。
4. 7900ポートで、Seleniumの動作確認ができる。
-
コンテナ内で何が起こっているかを確認するには、http://localhost:7900/?autoconnect=1&resize=scale&password=secret に移動します。
-
Default の Password は、
secret
です。
まとめ
Seleniumは、情報が多いため、実施したいことを実現するための情報にすぐにアクセスできて楽でした。
作成中のWebアプリでは、Seleniumを活用したWebスクレイピング機能を導入する予定なので、それが完成したら、ご紹介したいと思います。
個人で、Blogもやっています、よかったら見てみてください。
注意事項
この記事は、AIQ 株式会社の社員による個人の見解であり、所属する組織の公式見解ではありません。
求む、冒険者!
AIQ株式会社では、一緒に働いてくれるエンジニアを絶賛、募集しております🐱🐹✨
詳しくは、Wantedly (https://www.wantedly.com/companies/aiqlab)を見てみてください。
参考・引用
AIQ 株式会社 に所属するエンジニアが技術情報をお届けします。 ※ AIQ 株式会社 社員による個人の見解であり、所属する組織の公式見解ではありません。 Wantedly: wantedly.com/companies/aiqlab
Discussion