Help us understand the problem. What is going on with this article?

SeleniumとPythonを用いて複数のウェブサイトをPDF保存

More than 1 year has passed since last update.

1) ChromeDriverのダウンロード

  1. 自分の使っているGoogle ChromeでブラウザのツールバーにあるChromeメニュー(点が縦に3つ並んでいるもの)をクリックします。[ヘルプ]から[Google Chromeについて]を選択し、バージョンを確認します。
  2. 同じバージョンのChromeDriverを http://chromedriver.chromium.org/downloads からダウンロードします。
    • (注) ここで最新版を選んでしまうとサポートされていないことがあるので、自分が使っているものと同じものを選んでおくのが無難です。筆者の場合、当時(2019/5/27)バージョン75を最初にインストールしてしまって失敗しました。
    • (注) 他の方法はPython + Selenium で Chrome の自動操作を一通りが参考になります。今回はバイナリファイルをPythonプログラムと同じフォルダにおいていますが、そうしない方法もあるようです。

2) seleniumのインストール

pip install seleniumで導入できます。

3) コード

rpa.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import os
from selenium import webdriver

# アドレスの設定
addrs=[
'https://example.com/page1.html',
'https://example.com/page2.html',
'https://example.com/page3.html'
]

# 実際に実行する関数と補助関数
def dl_pdf(addr):
    driver.get(addr)
    driver.execute_script('return window.print()')

def main(addrs):
    for addr in addrs:
        dl_pdf(addr)


# Google Chrome Driverの設定
chopt=webdriver.ChromeOptions()
appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local",
            "account":""
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2
}

prefs = {'printing.print_preview_sticky_settings.appState': 
json.dumps(appState)}
chopt.add_experimental_option('prefs', prefs)
chopt.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='./chromedriver',options=chopt)

# 実行部
if __name__ == '__main__':
    main(addrs)

フォルダ内の構造

.
├── chromedriver
└── rpa.py

python rpa.pyでこのコードを実行すると、デフォルトのダウンロード先(筆者の場合~/Downloads)にPDFファイルが保存されます。ダウンロード先を変更することもこのコードを書き換えればできるはずです。

ハマったところ・重要なところ

  1. account:""が印刷先をPDFに設定するために必須です。この設定が必要なのを見つけるのに随分時間を空費しました。
  2. chopt.add_argument('--kiosk-printing')は印刷画面が開いたときに印刷ボタンを自動で押させる設定です。

拡張

ghostscriptを用いると、作成したPDFをかんたんに結合できます。

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf input1.pdf input2.pdf

のようなコマンドです。コマンドラインでpdfを連結する方法を参考にしました。

4) 注意点

有料ジャーナルなどでこのプログラムを使用してはいけません。すぐ止められてしまいます。このプログラムを使用して起きた損害については一切責任を負いません。

cozy16
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away