Chrome操作自動化

PythonでChrome操作を完全自動化!URLアクセスからPDF保存まで一気にラクする方法

ryoma_rakushiyo

このページでは、PythonでSeleniumを使ったChromブラウザの自動操作を説明します。
特定のページへアクセスして、PDFで保存する簡単な操作を行います。

さくっと試してみよう!

ライブラリをインストールする

ブラウザを操作するためにSeleniumをインストールします。

コマンドプロンプト(Windows)またはターミナル(Mac)を開き、pipコマンドを入力して実行します。

Macの場合
pip3 install selenium
Zsh
Windowsの場合
pip install selenium
Zsh

インストールが完了すると、Seleniumが使えるようになります。

Q
インストールされているか不安な場合は(確認方法)

コマンドプロンプト(Windows)またはターミナル(Mac)にてpip showコマンドでseleniumを指定します。

Macの場合
pip3 show selenium
Zsh
Windowsの場合
pip show selenium
Zsh

コマンドを実行した結果、以下のような例になっていればインストールができています。

この例では「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で見ている方は目次を右クリックし、新しいウインドウを開いていただくことを推奨しています。

片面でサンプルコード全体像を表示し、もう片面にて解説をご覧ください。

Q
推奨の見方
  • 目次を右クリック
  • 新しいウインドウで開く
  • 左右に並べる

参考情報

Q
サンプルコード全体像を表示する
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
Q
必要なライブラリのインポート
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
Python
  • os:
    ファイルやディレクトリの操作を行うための標準ライブラリ。
  • json:
    JSON形式のデータを扱うための標準ライブラリ。
  • selenium:
    ウェブブラウザの自動操作を行うライブラリ。
  • webdriver:
    ブラウザを自動操作するための機能を提供するモジュール
  • Options:
    Chromeブラウザの起動オプションを設定するクラス
  • WebDriverWait:
    指定した条件が満たされるまで待機するためのクラス
  • expected_conditions as EC:
    特定の条件を定義するためのモジュール
Q
関数 save_as_pdf の定義
def save_as_pdf(target_url, save_dir):
    """特定のページをPDFとして保存する"""
Python
  • PDFを保存する関数を定義しておきます。
  • target_url:
    PDFに保存したいウェブページのURL。
  • save_dir:
    PDFを保存するディレクトリ。

Chromeの印刷設定をする

Q
Chromeオプションの設定
chrome_options = Options()
Python
  • Optionsクラスのインスタンスを作成。
  • Chromeブラウザの設定をオプションで指定します。
  • こちらのchrome_optionsに印刷設定やPDFの保存場所、印刷ダイアログのオプションを加えていきます。
Q
印刷と保存の設定
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,
    }
Python
  • 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を保存するディレクトリを指定しています。
Q
印刷設定をオプションとして加える
chrome_options.add_experimental_option("prefs", chrome_prefs)
# 印刷ダイアログを表示しない
chrome_options.add_argument("--kiosk-printing")
Python
  • さきほどchrome_prefsにした印刷設定をchrome_optionsにオプションとして追加します。
  • おなじくchrome_optionsに- -kiosk-printingオプションを追加します。このオプションは印刷ダイアログを表示せずに自動で印刷を実行します。
Q
ChromeDriverの起動
driver = webdriver.Chrome(options=chrome_options)
Python
  • 設定したオプションを使ってChromeブラウザを起動します。

Chrome自動操作を定義する

Q
指定したURLにアクセス
driver.get(target_url)
Python
  • 指定したURLのページにアクセスします。
Q
ページの読み込みを待機
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located)
Python
  • ページ上のすべての要素が読み込まれるまで最大10秒待機します。

driver.execute_script(“window.print();”)への実行が早すぎるとPDF保存がうまくいきません。

Q
ページの保存
driver.execute_script("window.print();")
Python
  • JavaScriptのwindow.print() メソッドを実行して印刷ダイアログをトリガーします
Q
終了
driver.quit()
Python
  • Chromeブラウザを閉じます。

Chrome自動操作を指示する

Q
使用例
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
  • URL:
    PDFに保存したいウェブページのURL。
  • OUTPUT_PATH:
    PDFを保存するディレクトリパス。
  • ディレクトリが存在しない場合は新たに作成します。
  • save_as_pdf(URL, OUTPUT_PATH) 関数を呼び出してPDFを保存します。

コードを変えて遊んでみよう!

STEPごとにコードを変えて実行してみてね!

サンプルコードの指定の箇所を変えてみましょう!

PDF保存のページの向きを変えてみよう

Q
「”isLandscapeEnabled”: True」にしよう

下記のようにハイライトの部分をFalseからTrueにかえて実行してください。

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": True,
                # "scalingType": 3,
                # "scaling": "180",
                "marginsType": 0,
                "isHeaderFooterEnabled": False,
                "isCssBackgroundEnabled": True,
...省略
Python

PDF保存のサイズをA4からA3に変えてみよう

Q
“mediaSize”: {“A3用の設定に書き換える”}

下記のようにハイライト部分のA3用のパラメーターに書きかえてください。

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,
            # 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"}
...省略
Python
Q
全ての印刷サイズのパラメータ一覧はこちら

全ての印刷サイズを簡略化して一覧にしています。
“height_microns” : から順番にあてはめて利用してみてください。

あてはめ方はA3サイズの設定と比べてみてください。

いろんなサイズを試してくださいね!

'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']
Python

複数のURLをPDF保存してみよう

Q
URLのリストを準備して実行しよう
  • 1つめのハイライト
    url_list = [] にURLをダブルコーテーションで囲い、カンマで区切り追加していきましょう!
  • 2つめのハイライト
    save_as_pdf関数をループするように書きかえてください。
# 使用例
# 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)
Python

日常生活や仕事へ活用してみよう!

  • 定期的に更新されるデータやレポートのページをPDF化してバックアップ。
  • 趣味に関するウェブページ(例: DIYプロジェクト、ガーデニング、レシピ)をPDF化して参照用に保存。
  • ニュースサイトトップページの見出しをPDF化して、その時々のニュース見出しを記録。

毎日情報がかわって、その情報を見返したい場合にPDF化は良いと思います。

また、一度保存するとネットに繋がっていなくても見ることができますね!

いろんな活用方法があると思いますので、たくさん試してみてください。

今回はかんたんなURLアクセスのみなので、ログインが必要なページなどはSeleniumを使ってウェブの追加操作が必要になってきますね。


今後紹介していきたいと思います。

ABOUT ME
ryoma|ラクシヨ
ryoma|ラクシヨ
ブロガー / プログラミング
「楽をしよう」をモットーに、日々の生活や仕事を効率化し、シンプルにすることを目指しています。

  • 複雑なことは小分けにしてシンプルにし「ラクシヨ」
  • 毎日の繰り返しは仕組み化し「ラクシヨ」
  • 苦手なことは得意な人に任せて「ラクシヨ」
  • Tツールを活用して「ラクシヨ」
  • 未来を見据えて判断や方向性を間違えないようにして今後の未来を「ラクシヨ」

    努力も大切ですが、判断や方向性を間違えないようにして、自分が大切なことにもっと時間をかけたいと思っています。そのためにも一緒に「楽をしよう」。

    このブログでは、私の経験や知識をシェアし、皆さんが少しでも「楽」をできるような情報を提供していきます。どうぞよろしくお願いします。

    経歴:
    会計事務所に10年勤務。法人、個人事業主合わせて約100社を担当、サポート。
    業界特有のアナログな環境の中で、作業に追われる日々から抜け出そうと、独学でITスキルを磨き続けました。 現在はExcelを得意とし、RPAの作成やPythonを駆使して業務を効率化するスキルを身につけ、会社全体で5,000時間の作業時間短縮に貢献。
  • 記事URLをコピーしました