目次
headlessモードだとファイルのダウンロードが出来ない?
Seleniumでファイルをダウンロードするということがあり、あまり深く考えずに通常モードからheadlessモードに切り替えたら、ファイルのダウンロードが出来なくなってしまいました。
Chromeでは、ダウンロードが始まると左下にダウンロード状況が表示されるというのがあると思います。恐らく、これが原因になっていて、headlessモードではファイルのダウンロードが出来ないということのようです。
headlessモードでのファイルダウンロードNG回避方法
それでは、どのように回避すれば良いのでしょう?
それは、driverのオプションとcommandのパラメータで回避出来るということが分かりました。
それがこちらの方法です。
オプションにprefsを設定する
まずは、prefsというオプションを設定する必要があります。
設定内容は以下の通りで、argumentとしてではなく、experimental_optionとして、prefsを設定します。中身としては書かれているとおり、ダウンロードのpromptを出さないようにする設定のようです。
options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_experimental_option('prefs', { 'download.prompt_for_download': False, }) driver = webdriver.Chrome(chrome_options=opt)
driverにダウンロード時の設定を書き込む
続いて、driverからのダウンロードリクエスト時のパラメータを書き換えます。
設定内容は以下の通りで、POST実行時のdownload behaviorを許可するというところが重要なようです。
driver.command_executor._commands["send_command"] = ( 'POST', '/session/$sessionId/chromium/send_command' ) driver.execute( 'send_command', params={ 'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': '/home/<download_path>'} } )
保存ボタンなどのクリックしてファイルをダウンロード
あとは、スクレイプするページのファイルダウンロードボタンなどを押下するようにして、ダウンロード出来ることを確認出来れば完了です。
headlessモードで動かすと、色々な障壁が出てきます。
ただ、やっぱりheadlessモードで動かす方がメモリの使用量などを考えると良いので、なるべくheadlessモードで動かせるようにカスタマイズしていきたいものです。