概要
タイトルの通り、SeleniumでWebサイトをPDFとして保存するとき、デフォルトの保存先を変更する方法を解説します。日本語で調べて出てくる情報が、私の調べた限りだと、上手いことできずに少しつまづいたので共有しようと思いました。なお、WebDriverはChrome用のものを公式サイトからダウンロードして使用しています。言語はPythonですが、ChromeDriverを使っていて同じような状況の場合は言語に関わらず有用な情報だと思います。
前置き
Seleniumを使って、WebサイトをPDFとしてダウンロードする方法が知りたい方はこちらのサイトを参考にしてください。
ただし、こちらのサイトにはデフォルトの保存先の変更方法に関して間違いがあり、それに関する解説が本記事の目的です。
本題
まず、結論から書くと、ページの印刷用(WebサイトをPDFとして保存する用)のデフォルトフォルダを変更するには、ChromeDriverのoptionsでsavefile.default_directory
に保存先のフォルダへのパスを設定するだけです。
以下がサンプルコードです。
import json
from selenium import webdriver
# 印刷用の設定
appState = {
"recentDestinations": [
{
"id": "Save as PDF",
"origin": "local",
"account": ""
}
],
"selectedDestinationId": "Save as PDF",
"version": 2
}
profile = {'printing.print_preview_sticky_settings.appState': json.dumps(appState),
'savefile.default_directory': 'path/to/dir/'} # ここでデフォルトの保存先を設定
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('prefs', profile)
chrome_options.add_argument('--kiosk-printing') # 印刷用のプロンプトが表示された時、自動的に印刷ボタンが押される
driver = webdriver.Chrome(options=chrome_options) # webdriverを設定
driver.get(url) # urlへアクセス
driver.execute_script('window.print();') # javascriptを実行して印刷用のプロンプトを表示
ポイントは以下のコードの2行目にあるsavefile.default_directory
の値を任意の保存先フォルダへのパスに変更することです。
profile = {'printing.print_preview_sticky_settings.appState': json.dumps(appState),
'savefile.default_directory': 'path/to/dir/'} # ここでWebサイトをPDFとして保存する時の保存先を設定する
補足:保存先フォルダの指定には相対パスではなくフルパスが推奨されています
少しだけ詳しく解説
上のサンプルコードは主に、Seleniumを使ってWebサイトをPDFとして保存する際に必要なChromeDriverの設定となっています。
各設定に関する説明は一番最初に貼った記事がわかりやすくまとめているのでそちらに譲りますが、デフォルトの保存先に関しての情報が少し間違っていました。
記事では、デフォルトの保存先のフォルダの変更を、download.default_directory
の値を変更することで実現しようとしています。しかし、Chromeにおいて「ダウンロードするファイル」の扱いと、「印刷用のプロンプトから保存されるPDF」の扱いは異なり、後者の場合はsavefile.default_directory
の値を変更する必要があります。
download.default_directory
で設定された値(フォルダの場所)は、Chromeの設定>詳細設定>ダウンロード>保存先
に反映されています。しかし、実際に試してみればわかりますが、たとえここの設定がデスクトップに変更されていたとしても、印刷用のプロンプトからPDFとして保存する場合、デフォルトの保存先はデスクトップになっていません。つまり、その設定の変更はPDFとして保存する場合には反映されていないのです。
そして、Chromeの場合、その設定の変更はsavefile.default_directory
に値をセットすることで実現できます。
あとがき
私の調べ方が悪いのか、あるいは以前まではそうだったのか。なぜか日本語では前述の記事以外にも、PDFとして保存する場合のデフォルト保存先はdownload.default_directory
の値を変更することで実現できると解説している記事ばかり見つかります。
おかげで、デフォルトの保存先が変更されない理由を特定するのにかなり難航してしまい、ようやくStackOverflowでsavefile.default_directory
に関する解説があった時はずいぶん嬉しかったものでその勢いのままこの記事を書きました。
あまり需要のない情報だからか、日本語で調べてもそれに関する情報が出てこないため、今後同じ状況の人が同じ場所で躓かなければ幸いです。