🌆

Docker ComposeでSeleniumの環境構築をする方法(APIとSeleniumで連携する)

2024/01/14に公開

こんにちは、AIQ株式会社のフロントエンドエンジニアのまさぴょんです!
今回は、Docker ComposeでSeleniumの環境構築をする方法(APIとSeleniumで連携する)について、解説します。

Docker ComposeでSeleniumの環境構築をする

以前、Seleniumを使って、電話番号から会社名を特定する方法・Google検索して情報を取得する方法(Webスクレイピング)について記事にしました。
(Seleniumの説明や、Local環境での環境構築についても、こちらの記事に記載しています)
https://zenn.dev/aiq_dev/articles/9f37b6445ecf3c

今回は、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の内容は、次のとおりです。

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の内容は、次のとおりです。

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プロジェクトは完成しました。
この後、実際に動作確認をしてみます。

https://github.com/yukimura-manase/selenium-docker

動作確認をする

  1. Image の Build と Container の立ち上げを実施します。
docker compose up --build
  1. テストスクリプト実行環境のコンテナに入ります。
docker exec -it scraping-app /bin/bash
  1. テストスクリプトを実行します。
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は、こちらです。

https://github.com/seleniumhq-community/docker-seleniarm

(おまけ)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の動作確認ができる。

まとめ

Seleniumは、情報が多いため、実施したいことを実現するための情報にすぐにアクセスできて楽でした。

作成中のWebアプリでは、Seleniumを活用したWebスクレイピング機能を導入する予定なので、それが完成したら、ご紹介したいと思います。

個人で、Blogもやっています、よかったら見てみてください。

https://masanyon.com/

注意事項

この記事は、AIQ 株式会社の社員による個人の見解であり、所属する組織の公式見解ではありません。

求む、冒険者!

AIQ株式会社では、一緒に働いてくれるエンジニアを絶賛、募集しております🐱🐹✨

詳しくは、Wantedly (https://www.wantedly.com/companies/aiqlab)を見てみてください。

参考・引用

https://zenn.dev/manase/scraps/28fe7b34824e79

https://tech-lab.sios.jp/archives/28840

https://github.com/seleniumhq-community/docker-seleniarm

https://zenn.dev/lovegraph/articles/26109f0bc2f4c5

https://nekonenene.hatenablog.com/entry/2023/06/16/012636

AIQ Tech Blog (有志)

Discussion