PythonでChrome操作を完全自動化!URLアクセスからPDF保存まで一気にラクする方法
このページでは、PythonでSeleniumを使ったChromブラウザの自動操作を説明します。
特定のページへアクセスして、PDFで保存する簡単な操作を行います。
さくっと試してみよう!
ライブラリをインストールする
ブラウザを操作するためにSeleniumをインストールします。
コマンドプロンプト(Windows)またはターミナル(Mac)を開き、pipコマンドを入力して実行します。
インストールが完了すると、Seleniumが使えるようになります。
- インストールされているか不安な場合は(確認方法)
-
コマンドプロンプト(Windows)またはターミナル(Mac)にてpip showコマンドでseleniumを指定します。
コマンドを実行した結果、以下のような例になっていればインストールができています。
この例では「Version」の行にインストールされているSeleniumのバージョンが表示されています。
サンプルコードをコピーする
Chromeで特定のWebページを開いてPDFとして保存するコードです。
下記をコピーしてください。(右上のマークをクリックするとコピーできます。)
import os
import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def save_as_pdf(target_url, save_dir):
"""特定のページをPDFとして保存する"""
# Chromeオプションの設定
chrome_options = Options()
# 印刷設定の指定
chrome_prefs = {
"printing.print_preview_sticky_settings.appState": json.dumps(
{
"recentDestinations": [
{"id": "Save as PDF", "origin": "local", "account": ""}
],
"selectedDestinationId": "Save as PDF",
"version": 2,
"isLandscapeEnabled": False,
# "scalingType": 3,
# "scaling": "180",
"marginsType": 0,
"isHeaderFooterEnabled": False,
"isCssBackgroundEnabled": True,
# A4
"mediaSize": {
"height_microns": 297000,
"imageable_area_bottom_microns": 0,
"imageable_area_left_microns": 0,
"imageable_area_right_microns": 210000,
"imageable_area_top_microns": 297000,
"name": "ISO_A4",
"width_microns": 210000,
"custom_display_name": "A4"}
}
),
# 保存先ディレクトリの指定
"savefile.default_directory": save_dir,
}
chrome_options.add_experimental_option("prefs", chrome_prefs)
# 印刷ダイアログを表示しない
chrome_options.add_argument("--kiosk-printing")
# ChromeDriverの起動
driver = webdriver.Chrome(options=chrome_options)
# 指定したURLにアクセス
driver.get(target_url)
# ページ上のすべての要素が読み込まれるまで待機
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located)
# ページの保存
# 印刷ダイアログをトリガー
driver.execute_script("window.print();")
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located)
# 終了
driver.quit()
# 使用例
# PDFに保存したいページのURL
URL = "https://python-rakushiyo.com/"
# 保存先ディレクトリ
OUTPUT_PATH = r"/Users/ryoma/Desktop/pdf_directory/"
if not os.path.exists(OUTPUT_PATH):
os.mkdir(OUTPUT_PATH)
save_as_pdf(URL, OUTPUT_PATH)
Pythonコードを貼り付ける
Visual Studio Codeなどの実行環境にコピーしたサンプルコードを貼り付けましょう。
URLとOUTPUT_PATHを自分の環境に合わせる
貼り付けしたサンプルコードの変数URLと変数OUTPUT_PATHへの代入を書きかえます。
「’ ‘」で囲われている部分を書きかえてください。
サンプルコードのこちらの部分を
# PDFに保存したいページのURL
URL = 'https://python-rakushiyo.com/'
# 保存先ディレクトリ
OUTPUT_PATH = r'/Users/ryoma/Desktop/pdf_director/'
Python
例えばこのように書きかえます。
# PDFに保存したいページのURL
URL = 'https://google.com'
# 保存先ディレクトリ
OUTPUT_PATH = r'/Users/your_user_name/Desktop/'
Python準備完了、実行する
ブラウザが起動して、指定したWebページに移動します。
Chromeの印刷画面がたちあがるとともに、すぐに保存が開始され画面が閉じられます。
指定したフォルダを見てみるとPDFが保存されています。
コードを解説
Chromeの印刷設定を中心にPythonコードを解説します。
不必要な部分は読みとばしてください。
PCで見ている方は目次を右クリックし、新しいウインドウを開いていただくことを推奨しています。
片面でサンプルコード全体像を表示し、もう片面にて解説をご覧ください。
- 推奨の見方
-
- 目次を右クリック
- 新しいウインドウで開く
- 左右に並べる
参考情報
- サンプルコード全体像を表示する
-
Pythonimport os import json from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def save_as_pdf(target_url, save_dir): """特定のページをPDFとして保存する""" # Chromeオプションの設定 chrome_options = Options() # 印刷設定の指定 chrome_prefs = { "printing.print_preview_sticky_settings.appState": json.dumps( { "recentDestinations": [ {"id": "Save as PDF", "origin": "local", "account": ""} ], "selectedDestinationId": "Save as PDF", "version": 2, "isLandscapeEnabled": False, # "scalingType": 3, # "scaling": "180", "marginsType": 0, "isHeaderFooterEnabled": False, "isCssBackgroundEnabled": True, # A4 "mediaSize": { "height_microns": 297000, "imageable_area_bottom_microns": 0, "imageable_area_left_microns": 0, "imageable_area_right_microns": 210000, "imageable_area_top_microns": 297000, "name": "ISO_A4", "width_microns": 210000, "custom_display_name": "A4"} } ), # 保存先ディレクトリの指定 "savefile.default_directory": save_dir, } chrome_options.add_experimental_option("prefs", chrome_prefs) # 印刷ダイアログを表示しない chrome_options.add_argument("--kiosk-printing") # ChromeDriverの起動 driver = webdriver.Chrome(options=chrome_options) # 指定したURLにアクセス driver.get(target_url) # ページ上のすべての要素が読み込まれるまで待機 WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located) # ページの保存 # 印刷ダイアログをトリガー driver.execute_script("window.print();") WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located) # 終了 driver.quit() # 使用例 # PDFに保存したいページのURL URL = "https://python-rakushiyo.com/" # 保存先ディレクトリ OUTPUT_PATH = r"/Users/ryoma/Desktop/pdf_directory/" if not os.path.exists(OUTPUT_PATH): os.mkdir(OUTPUT_PATH) save_as_pdf(URL, OUTPUT_PATH)
- 必要なライブラリのインポート
-
Pythonimport os import json from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
- os:
ファイルやディレクトリの操作を行うための標準ライブラリ。 - json:
JSON形式のデータを扱うための標準ライブラリ。 - selenium:
ウェブブラウザの自動操作を行うライブラリ。 - webdriver:
ブラウザを自動操作するための機能を提供するモジュール - Options:
Chromeブラウザの起動オプションを設定するクラス - WebDriverWait:
指定した条件が満たされるまで待機するためのクラス - expected_conditions as EC:
特定の条件を定義するためのモジュール
- os:
- 関数 save_as_pdf の定義
-
Pythondef save_as_pdf(target_url, save_dir): """特定のページをPDFとして保存する"""
- PDFを保存する関数を定義しておきます。
- target_url:
PDFに保存したいウェブページのURL。 - save_dir:
PDFを保存するディレクトリ。
Chromeの印刷設定をする
- Chromeオプションの設定
-
Pythonchrome_options = Options()
- Optionsクラスのインスタンスを作成。
- Chromeブラウザの設定をオプションで指定します。
- こちらのchrome_optionsに印刷設定やPDFの保存場所、印刷ダイアログのオプションを加えていきます。
- Optionsクラスのインスタンスを作成。
- 印刷と保存の設定
-
Pythonchrome_prefs = { "printing.print_preview_sticky_settings.appState": json.dumps( { "recentDestinations": [ {"id": "Save as PDF", "origin": "local", "account": ""} ], "selectedDestinationId": "Save as PDF", "version": 2, "isLandscapeEnabled": False, # "scalingType": 3, # "scaling": "180", "marginsType": 0, "isHeaderFooterEnabled": False, "isCssBackgroundEnabled": True, # A4 "mediaSize": { "height_microns": 297000, "imageable_area_bottom_microns": 0, "imageable_area_left_microns": 0, "imageable_area_right_microns": 210000, "imageable_area_top_microns": 297000, "name": "ISO_A4", "width_microns": 210000, "custom_display_name": "A4"} } ), # 保存先ディレクトリの指定 "savefile.default_directory": save_dir, }
- chrome_prefsに印刷設定をJSON形式で指定します。
- json.dumps()でJSON形式にしています。
- PDFのページサイズやマージン、ヘッダー・フッターの有無などを設定しています。
- mediaSize:
用紙サイズ(例: ‘A4’, ‘Letter’など、対応する決められた値を設定) - isLandscapeEnabled:
印刷の向き。Falseは縦、Trueは横。 - marginsType:
余白のタイプ。0はデフォルト、1はなし、2は最小。 - isHeaderFooterEnabled:
ヘッダーとフッターの表示を有効にするかどうか。True または False - isCssBackgroundEnabled:
背景グラフィックの印刷を有効にするかどうか。True または False - savefile.default_directory:
PDFを保存するディレクトリを指定しています。
- 印刷設定をオプションとして加える
-
Pythonchrome_options.add_experimental_option("prefs", chrome_prefs) # 印刷ダイアログを表示しない chrome_options.add_argument("--kiosk-printing")
- さきほどchrome_prefsにした印刷設定をchrome_optionsにオプションとして追加します。
- おなじくchrome_optionsに- -kiosk-printingオプションを追加します。このオプションは印刷ダイアログを表示せずに自動で印刷を実行します。
- ChromeDriverの起動
-
Pythondriver = webdriver.Chrome(options=chrome_options)
- 設定したオプションを使ってChromeブラウザを起動します。
Chrome自動操作を定義する
- 指定したURLにアクセス
-
Pythondriver.get(target_url)
- 指定したURLのページにアクセスします。
- ページの読み込みを待機
-
PythonWebDriverWait(driver, 10).until(EC.presence_of_all_elements_located)
- ページ上のすべての要素が読み込まれるまで最大10秒待機します。
- ページの保存
-
Pythondriver.execute_script("window.print();")
- JavaScriptのwindow.print() メソッドを実行して印刷ダイアログをトリガーします
- 終了
-
Pythondriver.quit()
- Chromeブラウザを閉じます。
Chrome自動操作を指示する
- 使用例
-
PythonURL = "https://python-rakushiyo.com/" OUTPUT_PATH = r"/Users/ryoma/Desktop/pdf_directory/" if not os.path.exists(OUTPUT_PATH): os.mkdir(OUTPUT_PATH) save_as_pdf(URL, OUTPUT_PATH)
- URL:
PDFに保存したいウェブページのURL。 - OUTPUT_PATH:
PDFを保存するディレクトリパス。 - ディレクトリが存在しない場合は新たに作成します。
- save_as_pdf(URL, OUTPUT_PATH) 関数を呼び出してPDFを保存します。
- URL:
コードを変えて遊んでみよう!
STEPごとにコードを変えて実行してみてね!
サンプルコードの指定の箇所を変えてみましょう!
PDF保存のページの向きを変えてみよう
- 「”isLandscapeEnabled”: True」にしよう
-
下記のようにハイライトの部分をFalseからTrueにかえて実行してください。
Pythonchrome_prefs = { "printing.print_preview_sticky_settings.appState": json.dumps( { "recentDestinations": [ {"id": "Save as PDF", "origin": "local", "account": ""} ], "selectedDestinationId": "Save as PDF", "version": 2, "isLandscapeEnabled": True, # "scalingType": 3, # "scaling": "180", "marginsType": 0, "isHeaderFooterEnabled": False, "isCssBackgroundEnabled": True, ...省略
PDF保存のサイズをA4からA3に変えてみよう
- “mediaSize”: {“A3用の設定に書き換える”}
-
下記のようにハイライト部分のA3用のパラメーターに書きかえてください。
Pythonchrome_prefs = { "printing.print_preview_sticky_settings.appState": json.dumps( { "recentDestinations": [ {"id": "Save as PDF", "origin": "local", "account": ""} ], "selectedDestinationId": "Save as PDF", "version": 2, "isLandscapeEnabled": False, # "scalingType": 3, # "scaling": "180", "marginsType": 0, "isHeaderFooterEnabled": False, "isCssBackgroundEnabled": True, # A3 "mediaSize": { "height_microns": 420000, "imageable_area_bottom_microns": 0, "imageable_area_left_microns": 0, "imageable_area_right_microns": 297000, "imageable_area_top_microns": 420000, "name": "ISO_A3", "width_microns": 297000, "custom_display_name": "A3"} ...省略
- 全ての印刷サイズのパラメータ一覧はこちら
-
全ての印刷サイズを簡略化して一覧にしています。
“height_microns” : から順番にあてはめて利用してみてください。
あてはめ方はA3サイズの設定と比べてみてください。いろんなサイズを試してくださいね!
Python'Legal': [355600, 0, 0, 215900, 355600, 'NA_LEGAL', 215900, 'Legal'], 'Letter': [279400, 0, 0, 215900, 279400, 'NA_LETTER', 215900, 'Letter'], 'Tabloid': [431800, 0, 0, 279400, 431800, 'NA_LEDGER', 279400, 'Tabloid'], 'A0': [1189000, 0, 0, 841000, 1189000, 'ISO_A0', 841000, 'A0'], 'A1': [841000, 0, 0, 594000, 841000, 'ISO_A1', 594000, 'A1'], 'A2': [594000, 0, 0, 420000, 594000, 'ISO_A2', 420000, 'A2'], 'A3': [420000, 0, 0, 297000, 420000, 'ISO_A3', 297000, 'A3'], 'A4': [297000, 0, 0, 210000, 297000, 'ISO_A4', 210000, 'A4'], 'A5': [210000, 0, 0, 148000, 210000, 'ISO_A5', 148000, 'A5']
複数のURLをPDF保存してみよう
- URLのリストを準備して実行しよう
-
- 1つめのハイライト
url_list = [] にURLをダブルコーテーションで囲い、カンマで区切り追加していきましょう! - 2つめのハイライト
save_as_pdf関数をループするように書きかえてください。
Python# 使用例 # PDFに保存したいページのURL url_list = ["https://python-rakushiyo.com/", "https://python-rakushiyo.com/easy-url-access-and-pdf-saving/"] # 保存先ディレクトリ OUTPUT_PATH = r"/Users/ryoma/Desktop/pdf_directory/" if not os.path.exists(OUTPUT_PATH): os.mkdir(OUTPUT_PATH) for url in url_list: save_as_pdf(url, OUTPUT_PATH)
- 1つめのハイライト
日常生活や仕事へ活用してみよう!
- 定期的に更新されるデータやレポートのページをPDF化してバックアップ。
- 趣味に関するウェブページ(例: DIYプロジェクト、ガーデニング、レシピ)をPDF化して参照用に保存。
- ニュースサイトトップページの見出しをPDF化して、その時々のニュース見出しを記録。
毎日情報がかわって、その情報を見返したい場合にPDF化は良いと思います。
また、一度保存するとネットに繋がっていなくても見ることができますね!
いろんな活用方法があると思いますので、たくさん試してみてください。
今回はかんたんなURLアクセスのみなので、ログインが必要なページなどはSeleniumを使ってウェブの追加操作が必要になってきますね。
今後紹介していきたいと思います。