目次
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モードで動かせるようにカスタマイズしていきたいものです。