サイトを扱う上で資料作成は必須になってくる
自動化すると滅茶苦茶便利に・・・・というわけで
Python +Cromedriver+EXCELを使って WEB のフルスクリーンショットをリストから取得してみた。
・EXCEL+マクロで「設定」「リスト」の保存とシートの貼り付け
・Cromedriver でHTMLの取得表示
・Pythonで Cromedriverの制御(全画面の取得)をやってみている
今回はWindowsで稼働するものを作成してみた。
#スクリーンショット

基本的な考え方は「可能な限り汎用的に使えるツール」にする
「設定」に関するものはEXCELの「setup」シートにまとめるてシートの非表示
リストから自動でフルスクリーンショットを取得する。
検証環境も取得できるようにベーシック認証に対応する

Cromdriver についてはこのサイトを参考にした

windows は Pythonはインストールが必要なのでこのサイトを参考に設定

フルスクリーンショットを取得するPythonのコード
pythonのインストール chromedriver.exe のインストール
[pip install selenium] [pip install requests]の実行 が済んでいれば
コマンドラインからも実行できる
python実行パス capture_screenshot.py実行コードパス urlリスト 保存先file_path webdriver_path browser_width [basic_auth_id basic_auth_pass]

キャプチャスクリーンショット.py
import sys
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.alert import Alert
from selenium.common.exceptions import WebDriverException, TimeoutException

def debug_print_arguments(args):
    print("Arguments received:", args)

def debug_print_url(url):
    print("URL being accessed:", url)

def initialize_webdriver(webdriver_path, browser_width):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument(f"--window-size={browser_width}x1080")
    chrome_options.add_argument("--ignore-certificate-errors")
    chrome_options.add_argument("--allow-running-insecure-content")
    service = Service(webdriver_path)
    return webdriver.Chrome(service=service, options=chrome_options)

def handle_basic_auth(driver, basic_auth_id, basic_auth_pass):
    try:
        WebDriverWait(driver, 5).until(EC.alert_is_present())
        alert = Alert(driver)
        alert.send_keys(f"{basic_auth_id}\n{basic_auth_pass}")
        alert.accept()
    except TimeoutException:
        print("The authentication dialog was not displayed.")

def capture_screenshot(driver, file_path, browser_width):
    scroll_height = driver.execute_script("return document.body.scrollHeight")
    driver.set_window_size(browser_width, scroll_height)
    time.sleep(1)
    driver.save_screenshot(file_path)

try:
    debug_print_arguments(sys.argv)
    url = sys.argv[1]
    file_path = sys.argv[2]
    webdriver_path = sys.argv[3]
    browser_width = int(sys.argv[4])
    basic_auth_id = sys.argv[5].encode('shift-jis').decode('utf-8') if len(sys.argv) > 5 else None
    basic_auth_pass = sys.argv[6].encode('shift-jis').decode('utf-8') if len(sys.argv) > 6 else None

    if not url.startswith("http://") and not url.startswith("https://"):
        url = "https://" + url
    debug_print_url(url)

    if basic_auth_id and basic_auth_pass:
        protocol, host = url.split("://")
        url = f"{protocol}://{basic_auth_id}:{basic_auth_pass}@{host}"
    debug_print_url(url)

    driver = initialize_webdriver(webdriver_path, browser_width)
    try:
        driver.get(url)
        if basic_auth_id and basic_auth_pass:
            handle_basic_auth(driver, basic_auth_id, basic_auth_pass)
        WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
        capture_screenshot(driver, file_path, browser_width)
        print(file_path)
    except (WebDriverException, TimeoutException) as e:
        print(f"Err:An error has occurred: {str(e)}")
    finally:
        driver.quit()
except IndexError:
    print("Err:how to use: python script.py <url> <file_path> <webdriver_path> <browser_width> [<basic_auth_id> <basic_auth_pass>]")
except ValueError:
    print("Err:browser_width must be an integer.")
except Exception as e:
    print(f"Err:An Unexpected Error has occurred: {str(e)}")

Excelのシートの一つに設定情報の値と説明をまとめて記載

「setup」シートはこんな感じ

マクロを実行するリストの情報シートにはPC/SP対応のための画面サイズ ベーシック認証ID/PASS 画像に追加する文字列を記載する。
マクロの実行も3つに分けて作成
「シート作成」フルバージョン、シートを作成してスクリーンショットを張り付けて実行
「シート移動」フルバージョンで作成したシートを別のファイルに移動して保存する
「画像取得」のスクリーンショット取得のみ

リストのシートはこんな感じ

「画像取得」

取得結果を記載する 失敗した場合もエラーを記載してくれる

「シート作成」

実行したら結果表示

こんな風にシートを作成して張り付け

「シート移動」

元データ側から

新規ファイルに移動をしてくれる

マクロのはこのような流れ

初期設定:

  • 変数の宣言(ワークシート、行番号、カラム、URL、ファイルパスなど)。
  • 現在のオペレーティングシステム(OS)を判定し、MacまたはWindows環境を判別。

設定シート「setup」からの設定値の読み込み:

  • データの開始行、データ列、結果列、名称順序、名称リミット、各種カラムやセルの指定値を取得。

パスの確認:

  • Python実行ファイル、Pythonスクリプト、Chrome WebDriverのパスが正しく設定されているかを確認。
  • 設定が正しくない場合はメッセージを表示し、処理を終了。

データの最終行を取得し、処理件数の確認メッセージを表示。

データ列の開始行から最終行までを繰り返し処理:

  • 結果列が空白かを確認し、空白でない場合は次の行へ。
  • URLを取得し、空白の場合は「未処理」として次の行へ。

各種設定値の取得:

  • ブラウザ幅、ベーシック認証ID、パス、追加文字列を取得。

名称の生成:

  • 指定された順序で名称を結合し、リミットを超えた場合は切り捨て。
  • シート名に使えない記号を「_」に変換。

シートの存在確認と新規シートの作成:

  • 同じ名称のシートが存在するか確認し、存在する場合は「未処理」として次の行へ。
  • 新規シートを作成し、名称とURLを指定セルに記載。

スクリーンショットのファイルパスを生成し、シートに記載。

ファイルが既に存在するか確認し、存在する場合は「既存のスクリーンショットを使用」として次の行へ。

Pythonスクリプトを呼び出し、スクリーンショットを取得:

  • OSに応じてPythonスクリプトを呼び出すコマンドを作成し、実行。
  • 実行結果をセルに記録し、エラーチェック。

生成されたスクリーンショットをシートに貼り付け:

  • 画像を指定セルに貼り付け、サイズと枠線を調整。

結果列に処理完了の日時を記載し、新規シートへのリンクを作成。

処理が完了した後、指定フォルダを開く。

1つでもスクリーンショットを取得した場合はメッセージを表示。


作成したコードはこちら
稼働についてのサポートも保証もしません。(利用についてはご自身の判断でお願いします。)
すぐ答えられるかはわかりませんが、
要望や稼働の実例などがあればコメント等でお願いします。
ただ、基本いいコメント以外は受けたくありませんのでご理解ください。

Previous post 他人の子とAIは成長は早い
Next post Pythonを使って指定のURLのフルスクリーンショットを保存する方法

WEBのフルスクリーンショットをまとめて撮る」への1件のフィードバック

  1. インストールの手順はありますが、使っていて便利なので公開します。
    やはり要望はかなりあるようなので・・・
    2024.11.10

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.