ファイルのダウンロードをするSeleniumのスクリプトを、docker上でheadlessモードのChromeDriverで動作させた際、ファイルのダウンロード処理に失敗する現象が起きたので、その対処方法のメモ書き
前準備
基本的なところは前回と同じ modalsoul.hatenablog.com
ファイルのダウンロードをする処理を追加しています(と言っても、anchorをクリックするだけですが
ダウンロード先ディレクトリを掘って
> make scraping > docker-compose run scraping /bin/sh > python scraping.py
のような感じで実行できます
現象その1
headlessモードで動作させると、ファイルのダウンロードがされない
対処
ggってこれを見つけました
python - Downloading with chrome headless and selenium - Stack Overflow
セキュリティの制約?で失敗しているようで、chromedriverのコマンドにPage.setDownloadBehavior
を追加する必要があるようです
スクリプトを以下のように変更しました
これを実行すると、今度は別のエラーが
現象その2
selenium.common.exceptions.WebDriverException
で失敗する
/opt/app/scraping # python scraping.py 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 -v ChromeDriver 2.30 (30087a73289cd80b9611f658ed81448badaf549e)
対処
alpine3.8を使います
これで2.38
がインストールできました
/opt/app/scraping # chromedriver -v ChromeDriver 2.38 (f91d32489882be7df38da3422a19713bfd113fa5)
スクリプトを実行し、無事ファイルのダウンロードが確認できました
これ以外にもいくつかエラーに遭遇したので、また別にまとめようと思います