Seleniumのheadlessモードでファイルをダウンロードする際に必要な設定

Python

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

コメントを残す