案件でDockerでPython+Selenium+Firefoxによるwebスクレイピング環境を構築したのですが、その際にファイルダウンロードやpyinstallerでのexe化でハマったのでメモしておきます
前提記事
この記事は下記の記事の内容を前提としています。
前回の記事:【Python】Docker+Seleniumで自動化環境を構築してVNCでブラウザの動作確認
まず前回の記事で作成してリポジトリをさらに改良したものが下記のリポジトリになります
リポジトリのURL:
https://github.com/beginerSE/docker_python_selenium4_firefox_pyinstaller
上記の環境構築でハマった点
FireFoxのファイルダウンロードが止まる
上記のリポレジトリの環境だとDockerでPython+Selenium4+Firefoxでスクレイピングする環境は構築できているのですが、ファイルをダウンロードした時に、ダウンロードダイアログが出て、それをなんとかできないままダウンロードできずに終わることがありましたがDriver起動時に以下のようなオプションを追加してあげることで解決しました
<test.py>
~~~~~~~~~~~~~~~~~~~~~~~~~~~ from selenium.webdriver.firefox.options import Options as FirefoxOptions from selenium import webdriver import selenium options = FirefoxOptions() # Docker環境用の設定 cloud_options = {} cloud_options['build'] = "build_1" cloud_options['name'] = "test_abc" options.set_capability('cloud:options', cloud_options) # ダウンロード関連の設定を追加 download_dir = "/app/src/" # Dockerコンテナ内のパス options.set_preference("browser.download.folderList", 2) options.set_preference("browser.download.manager.showWhenStarting", False) # ホップアっプを非表示 options.set_preference("browser.download.dir", download_dir) options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/zip") # 例: ZIPの場合 # options.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv") # csvエクセルファイルの場合 # ドライバー起動 driver = webdriver.Remote( command_executor=os.environ["SELENIUM_URL"], options=options ) ~~~~~~~~~~~~~~~~~~~~~~~~~~~
追加したのは下記の部分です。これにより指定したMINEタイプのファイルをダウンロードする際はホップアップが表示されなくなります。(指定したMINEタイプ以外のファイルをダウンロードする場合は変わらず表示されるので注意してください)
download_dir = "/app/src/" # Dockerコンテナ内のパス options.set_preference("browser.download.folderList", 2) options.set_preference("browser.download.manager.showWhenStarting", False) # ホップアっプを非表示 options.set_preference("browser.download.dir", download_dir) options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/zip") # 例: ZIPの場合
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/zip")
の部分は"application/zip"
はダウンロードするファイルのMINEタイプを指定してください(例:csvの場合は”text/csv”)
その他のMINEタイプ一覧:https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
ダウンロードしたファイルが見つからない
上記をクリアしてファイルのダウンロードは成功したのですが、そのファイルをローカルで確認できなくてハマりましたが、docker-compose.ymlに「– ./tempDownload:/home/seluser/Downloads」を追記してあげることで解決しました。
Docker+Firefoxのスクレイピング環境でダウンロードしたファイルは「/home/seluser/Downloads」に保存されるので、それをローカルでもマウントするように指定することでコンテナ内でダウンロードしたファイルをローカルで確認することができるようになりました
<docker-compose.yml>
version: "3" services: selenium: container_name: python-selenium-on-docker_selenium image: selenium/standalone-firefox-debug:3.141.59 ports: - 4444 - 5901:5900 volumes: - /dev/shm:/dev/shm - ./tempDownload:/home/seluser/Downloads app: container_name: python-selenium-on-docker_app depends_on: - selenium build: ./app volumes: - ./app:/app - ./tempDownload:/home/seluser/Downloads environment: SELENIUM_URL: http://selenium:4444/wd/hub tty: true
終わり
このコンテナの起動方法やDockerの設定については下記の記事で説明しているのでそちらを参考にしてください
関連記事:【Python】Docker+Seleniumで自動化環境を構築してVNCでブラウザの動作確認
コメント
[…] 関連記事:【Python】Selenium4 + Firefoxでファイルダウンロードを自働化する環境を構築するサンプルコード […]