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

基本的な考え方は「可能な限り汎用的に使えるツール」にする
「設定」に関するものは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]

capture_screenshot.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のフルスクリーンショットを保存する方法