サイトを扱う上で資料作成は必須になってくる
自動化すると滅茶苦茶便利に・・・・というわけで
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」シートはこんな感じ
![](https://sakaida.jp/wp-content/uploads/2024/07/image-2.png)
マクロを実行するリストの情報シートにはPC/SP対応のための画面サイズ ベーシック認証ID/PASS 画像に追加する文字列を記載する。
マクロの実行も3つに分けて作成
「シート作成」フルバージョン、シートを作成してスクリーンショットを張り付けて実行
「シート移動」フルバージョンで作成したシートを別のファイルに移動して保存する
「画像取得」のスクリーンショット取得のみ
リストのシートはこんな感じ
![](https://sakaida.jp/wp-content/uploads/2024/07/image-3-1024x91.png)
「画像取得」
取得結果を記載する 失敗した場合もエラーを記載してくれる
![](https://sakaida.jp/wp-content/uploads/2024/07/image-4.png)
「シート作成」
実行したら結果表示
![](https://sakaida.jp/wp-content/uploads/2024/07/image-5.png)
こんな風にシートを作成して張り付け
![](https://sakaida.jp/wp-content/uploads/2024/07/image-6-769x1024.png)
「シート移動」
元データ側から
![](https://sakaida.jp/wp-content/uploads/2024/07/image-8.png)
新規ファイルに移動をしてくれる
![](https://sakaida.jp/wp-content/uploads/2024/07/image-7-844x1024.png)
マクロのはこのような流れ
初期設定:
- 変数の宣言(ワークシート、行番号、カラム、URL、ファイルパスなど)。
- 現在のオペレーティングシステム(OS)を判定し、MacまたはWindows環境を判別。
設定シート「setup」からの設定値の読み込み:
- データの開始行、データ列、結果列、名称順序、名称リミット、各種カラムやセルの指定値を取得。
パスの確認:
- Python実行ファイル、Pythonスクリプト、Chrome WebDriverのパスが正しく設定されているかを確認。
- 設定が正しくない場合はメッセージを表示し、処理を終了。
データの最終行を取得し、処理件数の確認メッセージを表示。
データ列の開始行から最終行までを繰り返し処理:
- 結果列が空白かを確認し、空白でない場合は次の行へ。
- URLを取得し、空白の場合は「未処理」として次の行へ。
各種設定値の取得:
- ブラウザ幅、ベーシック認証ID、パス、追加文字列を取得。
名称の生成:
- 指定された順序で名称を結合し、リミットを超えた場合は切り捨て。
- シート名に使えない記号を「_」に変換。
シートの存在確認と新規シートの作成:
- 同じ名称のシートが存在するか確認し、存在する場合は「未処理」として次の行へ。
- 新規シートを作成し、名称とURLを指定セルに記載。
スクリーンショットのファイルパスを生成し、シートに記載。
ファイルが既に存在するか確認し、存在する場合は「既存のスクリーンショットを使用」として次の行へ。
Pythonスクリプトを呼び出し、スクリーンショットを取得:
- OSに応じてPythonスクリプトを呼び出すコマンドを作成し、実行。
- 実行結果をセルに記録し、エラーチェック。
生成されたスクリーンショットをシートに貼り付け:
- 画像を指定セルに貼り付け、サイズと枠線を調整。
結果列に処理完了の日時を記載し、新規シートへのリンクを作成。
処理が完了した後、指定フォルダを開く。
1つでもスクリーンショットを取得した場合はメッセージを表示。