目的、背景など
業務自動化の一環としてWebスクレイピングを独自に学習しています。
SeleniumにてWebページをPDF保存するために色んな記事を見て回ったんですが、
どれもPythonの記事ばかりでVBAの記事がありませんでした。
どうしても一部のソースコードの書き方がわからず、試行錯誤していたんですが、
英語の記事を見て解決に至りました。
めっちゃ探し回ったので私のほかにもVBAでスクレイピングしている方も苦戦したんじゃないかと思います。
なのでその記事の転載しようと思います。
作業環境
- Selenium Basic 2.0.9.0
- Microsoft Visual Basic for Applications 7.1
- Google Chrome バージョン:126.0.6478.182(Official Build)(64 ビット)
参考記事
https://github.com/florentbr/SeleniumBasic/issues/214
https://qiita.com/NauSakaguchi/items/76d66683f3c54e9d2a34
PythonでWebページをPDFで保存(サンプルとして参考記事から転載)
Pythonで行う場合、以下のappStateという文言をJson形式で記述し、所定の変数に格納します。
この文言の記述をVBAに書き直すのが詰まったポイントです。
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を実行して印刷用のプロンプトを表示
VBAでWebページをPDFで保存(本題)
参考記事をもとに書けたものが以下です。
単にJson構文をワンライナーに記述するところまでは想像できたんですが、それだけだと不十分でした。
このワンライナーをDictionaryとして、要はKey・Value型として格納する必要があったようです。
(というかDictってVBAでも使えたんですね。すんなりコンパイルできたんですが、もしかしたら追加したライブラリの一部かもしれません。調べるのめんどい)
Dim driver As New ChromeDriver
'PDF印刷用 パラメータ
Dim appState As String
Dim d As New Dictionary
driver.AddArgument "--kiosk-printing" '印刷ダイアログが開くと即時保存するオプション
appState = "{""recentDestinations"": [{""id"": ""Save as PDF"", ""origin"": ""local"", ""account"": """"}], ""selectedDestination"": ""Save as PDF"", ""version"": 2}"
d.Add "appState", appState
driver.SetPreference "printing.print_preview_sticky_settings", d
driver.SetPreference "savefile.default_directory", "c:\hoge" 'ここにPDFが保存される
driver.Start "chrome"
driver.Get "https://www.yahoo.co.jp/"
driver.Wait 3000
driver.ExecuteScript "window.print();" '印刷ダイアログを開き、PDFとして保存
driver.Wait 3000
driver.Close
driver.Quit
それともう一点詰まった箇所があります。
PythonにしろVBAにしろ保存先の指定はdriver.SetPreference "download.default_directory", filePath
で記述されている記事がほとんどです。
ですがこのやり方でのPDFの保存先は driver.SetPreference "savefile.default_directory", filePath
であるようです。
これは当記事でも参考記事として紹介している記事でも言及されています。
末筆
以上です。
結構詰まったんですが、いかがだったでしょうか。
もし以下のことで試行錯誤されている方がいたら、何かの助けになればと思います。
- Selenium VBA Webページ PDF保存
- VBAでJson構文関連の処理をしたい
- download.default_directoryで指定した保存先に保存されない
Pythonなんか無くてもこれくらいVBAでもできんだよ!!