ファイルのダウンロードをするSeleniumのスクリプトを、docker上でheadlessモードのChromeDriverで動作させた際、ファイルのダウンロード処理に失敗する現象が起きたので、その対処方法のメモ書き
前準備
基本的なところは前回と同じ
modalsoul.hatenablog.com
ファイルのダウンロードをする処理を追加しています(と言っても、anchorをクリックするだけですが
ダウンロード先ディレクトリを掘って
> make scraping
> docker-compose run scraping /bin/sh
> python scraping.py
のような感じで実行できます
現象その1
headlessモードで動作させると、ファイルのダウンロードがされない
- スクリプトが正常終了しても、保存先パスにファイルが存在しない
- dockerではなくローカルのmacで非headlessモードで実行すると成功する
対処
ggってこれを見つけました
python - Downloading with chrome headless and selenium - Stack Overflow
セキュリティの制約?で失敗しているようで、chromedriverのコマンドにPage.setDownloadBehavior
を追加する必要があるようです
スクリプトを以下のように変更しました
これを実行すると、今度は別のエラーが
現象その2
selenium.common.exceptions.WebDriverException
で失敗する
/opt/app/scraping
Traceback (most recent call last):
File "scraping.py", line 33, in <module>
main()
File "scraping.py", line 23, in main
enable_download_in_headless_chrome(driver, DOWNLOAD_PATH)
File "scraping.py", line 11, in enable_download_in_headless_chrome
driver.execute("send_command", params)
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: unhandled inspector error: {"code":-32601,"message":"'Page.setDownloadBehavior' wasn't found"}
(Session info: headless chrome=61.0.3163.100)
(Driver info: chromedriver=2.30 (30087a73289cd80b9611f658ed81448badaf549e),platform=Linux 4.9.93-linuxkit-aufs x86_64)
原因
Chromedriverのバージョンが古いために、Page.setDownloadBefavior
に対応していなかったようです
この時点でのChromedriverのバージョンは
/opt/app/scraping
ChromeDriver 2.30 (30087a73289cd80b9611f658ed81448badaf549e)
対処
alpine3.8を使います
これで2.38
がインストールできました
/opt/app/scraping
ChromeDriver 2.38 (f91d32489882be7df38da3422a19713bfd113fa5)
スクリプトを実行し、無事ファイルのダウンロードが確認できました
これ以外にもいくつかエラーに遭遇したので、また別にまとめようと思います