'sqr'atch-note

ちりはつもれど ちりぬるを

CLIでWebサイトのスクショを取る

developer.chrome.com

& "C:\Program Files\Google\Chrome\Application\chrome.exe" --headless --screenshot=C:\Users\noname\Pictures\sample.png https://google.com
  • 気をつける点は、Powershellで外部プログラムを実行する場合には&(アンパサンド)を先頭につけること。chrome.exeのパスが文字列として認識されてしまい、エラーとなる。もしくは、Start-Processコマンドでプログラムを実行する方法でも良い。

オプションについて

  • --headless=new
    • 上記公式ブログでは、新しいヘッドレスモードを利用するためには、newフラグを指定する必要があると書いてあるが、今回試したChrome 119では、フラグを指定すると逆に動かなかった。
    • また同ブログにはフラグ無しだと、古いヘッドレスモードが起動するとあるものの、新しいヘッドレスモード用のオプションは使えたので、もしかしたらフラグの設定は不要になって、デフォルト動作が新しいヘッドレスモードになったのかもしれない。しらんけど。
  • --screenshot
    • スクリーンショットを取得するオプション。このオプションと併用できる物として以下のものがある。
    • --window-size
      • --window-size=1920,1080のように指定して、スクショのサイズを変更できる
    • --timeout
      • ページのレンダリングを一定時間待ってからスクショを取るためのオプション
  • --print-to-pdf
    • WebサイトをPDFとして保存するオプション
      • Webサイトのフルサイズスクショを取りたい場合は、PDFとして出力したほうが良い。windows-sizeオプションでは絶対値で指定するので、足りなかったり余白が多くなったりしがち。

PythonSeleniumでスクショを取る

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless') ## ヘッドレスモードを指定
driver = webdriver.Chrome(options=options)

url = "https://www.python.org"
driver.get(url)

## ページの最大幅
page_width = driver.execute_script('return document.body.scrollWidth')
## ページの最大縦
page_height = driver.execute_script('return document.body.scrollHeight')

driver.set_window_size(page_width, page_height)

filename = url.translate(str.maketrans({':': '_', '/': None}))) #=> https_www.python.org
driver.save_screenshot(filename + '.png') ## => True
driver.quit()
  • このプログラムでは、ページのフルサイズスクショを取得し、指定されたURLをファイル名として保存する。
  • うーん、基本のコードなのであまり追加で説明することはない。実行環境は以下の通り。