Closed14

Python Seleniumについて

まさぴょんまさぴょん

Seleniumの仕様変更の対応

  • Seleniumの仕様が変わっており、少し前の記事を参考にすると、エラー祭りになる。。。🥺
  • こちらの記事が参考になります。

https://zenn.dev/aew2sbee/articles/python-error-selenium

find_element_by_XXX系の新しい書き方

検索 旧記述 新記述
id .find_element_by_id("id") .find_element(By.ID, "id")
name .find_element_by_name("name") .find_element(By.NAME, "name")
xpath .find_element_by_xpath("xpath") .find_element(By.XPATH, "xpath")
リンクのテキスト .find_element_by_link_txt("link text") .find_element(By.LINK_TEXT, "link text")
リンクのテキスト(部分一致) .find_element_by_partial_link_text("partial link text") .find_element(By.PARTIAL_LINK_TEXT, "partial link text")
タグ名 .find_element_by_tag_name("tag name") .find_element(By.TAG_NAME, "tag name")
クラス名 .find_element_by_class_name("class name") .find_element(By.CLASS_NAME, "class name")
CSSセレクタ .find_element_by_css_selector("css selector") .find_element(By.CSS_SELECTOR, "css selector")
まさぴょんまさぴょん

Selenium を Web API (Flask・Docker環境) から Accessできるようにする。

  • Web APIに搭載するか?それとも、別のコンテナで作成するか?
  • Test自動化だったらDockerで、別コンテナで立ててもいいが、今回は、Webスクレイピング機能として、使いたいので、Web API内部に組み込みたい。。。
  • Chromedriverをpipコマンドでインストールすれば、Flask-APIの内部で動作するかな?
  • Containerは、別で立てた方が、Chromedriverのバージョン問題などにも悩まされずにすみそうなので、Dockerで別枠のSelenium Containerを作成する。

docker-selenium の GitHub

https://github.com/SeleniumHQ/docker-selenium?tab=readme-ov-file

Debian ARM64、ARM/v7、および AMD64 用に構築された Selenium 用の Docker イメージ

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

Selenium の公式 Docker Image たち

https://hub.docker.com/u/seleniarm

seleniarm/standalone-chromium

https://hub.docker.com/r/seleniarm/standalone-chromium

https://zenn.dev/carenet/articles/4ca98b5e35bb24

https://qiita.com/kei0919/items/f6f696169c92c936374c

https://tech-blog.optim.co.jp/entry/2021/06/21/100000

https://qiita.com/Afo_guard_enthusiast/items/02aa25b2afe1b18d7162

まさぴょんまさぴょん

Docker で Selenium を動かす Ver. ChromeDriver

1. Docker Image を installする
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 を使ったテストは、 http://localhost:4444 を指定して実施します。

4. コンテナ内で何が起こっているかを確認するには、http://localhost:7900/?autoconnect=1&resize=scale&password=secretに移動します。
  • Default の Password は、secret

注意事項
  • docker runブラウザを含む画像に対して実行する場合は、--shm-size=2gホストの共有メモリを使用するフラグを使用してください。

[ 参考・引用 ]

seleniarm/standalone-chromium Docker Image

https://hub.docker.com/r/seleniarm/standalone-chromium

Debian ARM64、ARM/v7、および AMD64 用に構築された Selenium 用の Docker イメージ

https://github.com/seleniumhq-community/docker-seleniarm?tab=readme-ov-file

まさぴょんまさぴょん

Selenium Docker の Driver info: driver.version: unknown エラー 解決方法

原因:M1 Mac などの ARMの影響

解決策:ARM環境の場合は、seleniarm の Docker Image を使用する

seleniarm/standalone-chromium

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

参考・引用

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

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

https://qiita.com/se_yataro/items/4a741658495cf43df552

まさぴょんまさぴょん

Response code 500. Message: unknown error: cannot create temp dir for user data dir エラーの状況と原因・解決策

1. 状況

  • Seleniumのセッションを開始できなかった。
  • ドライバー サービスとのセッションの作成中にエラーが発生しました。
  • ユーザー データ ディレクトリの一時ディレクトリを作成できません。

2. エラー原因の推測

  • Chrome Driver のバージョンが unknown になっている。
  • おそらく、Chrome Driverと Chromeの互換性問題だと考えられる。
  • または、Docker のメモリが足らないことによるエラーもある?

3. 解決策:Dockerのメモリ解放や、Arm対応(M1 Macの場合)

  • M1 Mac 環境なので、それによるエラーの可能性が高い。。。
  • だが、すでに、seleniarm/standalone-chromiumを使っているのに、なぜ発生するのか?

https://zenn.dev/aiq_dev/articles/0a4fdcfd5769b0

  • M1 Mac などの arm系だと動かない理由は、この記事でよく調査されている。

https://qiita.com/mejiro03/items/76f7080b3ab25cbee8e4

エラー内容

selenium.common.exceptions.SessionNotCreatedException:
Message: Could not start a new session.
Error while creating session with the driver service.
Stopping driver service: Could not start a new session.
Response code 500.
Message: unknown error: cannot create temp dir for user data dir

Error while creating session with the driver service.

Message: unknown error: cannot create temp dir for user data dir

Driver info: driver.version: unknown

翻訳

selenium.common.Exceptions.SessionNotCreatedException:
メッセージ: 新しいセッションを開始できませんでした。
ドライバー サービスとのセッションの作成中にエラーが発生しました。
ドライバー サービスを停止しています: 新しいセッションを開始できませんでした。
レスポンスコード500。
メッセージ: 不明なエラー: ユーザー データ ディレクトリの一時ディレクトリを作成できません

ドライバー サービスとのセッションの作成中にエラーが発生しました。

メッセージ: 不明なエラー: ユーザー データ ディレクトリの一時ディレクトリを作成できません

ドライバー情報:ドライバー.バージョン:不明

Dockerのメモリ解放について

  • 以前、書いたDockerのメモリ解放系の記事

  • こちらの記事では、メモリ制限をかけていたので、それはコメントアウトする。

https://zenn.dev/aiq_dev/articles/0a4fdcfd5769b0

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

Chrome Driver バージョンエラー系の参考記事

https://zenn.dev/gomo/articles/c5209a55835c28

https://yuki.world/python-chrome-driver-version-error/

https://yuki.world/python-selenium-chromedriver-auto-update/

Docker のディスク容量が足りない系の参考記事

https://aroundthedistance.hatenadiary.jp/entry/2021/11/09/103522

https://stackoverflow.com/questions/46066670/cannot-create-temp-dir-for-user-data-dir-error-when-not-running-as-admin

https://stackoverflow.com/questions/77184853/selenium-doesnt-work-in-docker-cannot-create-temp-dir-for-user-data-dir

https://github.com/SeleniumHQ/selenium/issues/12050

このスクラップは4ヶ月前にクローズされました