Seleniumで自動化!毎日更新されるHPの画面を効率的に保存する方法

プログラミング

Selenium ManagerでWebDriverを自動ダウンロード!HPをPDFとして毎日保存する方法

はじめに

ウェブサイトが毎日更新される場合、その情報を自動的に保存しておきたいことがあるかもしれません。従来、WebDriverを手動でダウンロードし、設定する必要がありましたが、Selenium 4.6以降で導入されたSelenium Managerを使えば、この作業が自動化されます。さらに、今回はheadlessモードが効かない問題を解決するための工夫として、ブラウザウィンドウを画面外に飛ばす方法も紹介します。

必要な準備

まず、Seleniumを利用してウェブページをPDFとして保存するための準備が必要です。ChromeDriverを自動的にダウンロードして使うには、Selenium Managerを活用しましょう。

  1. Seleniumライブラリのインストール
    Selenium Managerを使うには、seleniumライブラリをインストールしておきます。以下のコマンドを使用してください。

    pip install selenium
  2. Selenium ManagerによるWebDriverの自動ダウンロード
    Selenium 4.6以降では、WebDriverのパスを手動で指定する必要がなく、Selenium Managerが自動で適切なWebDriverを取得してくれます。このため、従来の手動設定を省略でき、コードがさらに簡潔になります。

ソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from pathlib import Path

output_dir = Path(__file__).resolve().parent

# Chromeオプションの設定
chrome_options = Options()
#chrome_options.add_argument('--headless')  # ヘッドレスモード(GUIなしで実行)
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
# 最初からウィンドウの位置を画面外に設定
chrome_options.add_argument("--window-position=-2000,0")  # x=-2000で画面外に移動
chrome_options.add_argument("--window-size=800,600")  # ウィンドウサイズを指定

# PDFで保存するためのオプション設定
chrome_options.add_experimental_option('prefs', {
    "printing.print_preview_sticky_settings.appState": '{"recentDestinations":[{"id":"Save as PDF","origin":"local","account":"","capabilities":{}}],"selectedDestinationId":"Save as PDF","version":2}',
    "savefile.default_directory": str(output_dir)  # PDF保存先のディレクトリ
})
chrome_options.add_argument('--kiosk-printing')  # 自動的に保存

# Selenium Managerを使用してChromeDriverを自動ダウンロード
driver = webdriver.Chrome(options=chrome_options)

# 対象のURLを開く
driver.get("https://www.yahoo.co.jp")

# 印刷ダイアログをトリガーしてPDFとして保存
driver.execute_script('window.print();')

# 処理完了のため少し待つ(必要に応じて調整)
time.sleep(10)

# ドライバを閉じる
driver.quit()

詳細な解説

  • Selenium Managerの導入
    従来は、ChromeDriverを手動でダウンロードして、それをパス指定する必要がありました。しかし、このコードではwebdriver.Chrome(options=chrome_options)という形でSelenium Managerを利用しているため、WebDriverの自動取得が行われます。
  • headlessモードが効かない問題
    実際には、headlessモードが機能しないケースが発生することがあります。特にPDF出力に関しては、headlessモードが正しく動作しないことが報告されています。そこで、このスクリプトではheadlessモードを無効にし、代わりに--window-position=-2000,0を使って、ブラウザウィンドウを画面外に飛ばすことで、見た目上の問題を解決しています。
  • PDF保存の自動化
    このスクリプトは--kiosk-printingオプションを使うことで、ユーザーの操作を必要とせずにPDFを自動保存します。また、保存先のディレクトリも指定することで、PDFファイルが決まった場所に保存されるように設定しています。

まとめ

この方法を使うと、Selenium Managerの導入によってWebDriverの自動ダウンロードが可能になり、headlessモードの問題を回避してウェブページをPDFとして自動保存することができます。もし、毎日変わるウェブページの情報を効率的に収集したい場合は、ぜひこの手法を試してみてください。

Commnts