Webページのキャプチャを定期的に自動で保存する方法

※2019/09/19 追記
現在ならば、Puppeteer (https://github.com/GoogleChrome/puppeteer) 一択です。

Webページを定期的にキャプチャしたい

特定のWebページのスクリーンショット(キャプチャ)をコマンドラインで定期的に保存する方法を模索していました。やり方自体が思いつかなかったので、素直に先人に従おうとWebを検索していろいろ試してみました。

その結果、CutyCaptを使う方法が現在では最善ではないかと思いました。以下、経緯や方法を書いていきます。

PhantomJS/CasperJSを試してみる

PhantomJSのWebサイトは次の通りです。

PhantomJS - Scriptable Headless Browser

使い方は例えば以下のWebページなど、たくさん出てきます。

検索で一番多くヒットするのはこの方法です。名前の通り、JavaScriptで書かれたWebKit(要はブラウザ)です。こいつを動かして特定のページを読み込み、そのページのスクリーンショットを撮ります。そのこと自体は特段難しいことではありません。しかし、問題があって、YouTubeの動画のサムネイルが表示されないのです。

これは現時点では以下のとおり、仕方がないようです。

したがって、スクリーンショットを正確に撮るという目的には合致しないため、PhantomJS/CasperJSは使用の候補から外しました。キャプチャ以外の用途でしたら有用な点は多くあると思います。現在もバージョンアップは続いていますので、今後またの機会に見なおしてみたいと思います。

wkhtmltoimage(wkhtmltopdf)を試してみる

wkhtmltoimageのWebサイトは次の通りです。

wkhtmltopdf

使い方は例えば以下のWebページにあります。

http://くまこ.jp/blog/technology/438/

以下のWebページは先述のPhantomJSとの比較をしています。

しかしながら、このwkhtmltoimageでも、YouTubeの動画部分は真っ黒になってしまって正しくキャプチャできませんでした。解決方法があるのかもしれませんがたどり着けず、wkhtmltoimageの使用も候補から外れました。

CutyCapt(IECapt)

そこで現れたのがCutyCaptです。

以下の2つのページに使い方があります。

このCutyCaptだと、--delayオプションを使って数秒読み込むことで、YouTubeのサムネイルもちゃんとキャプチャができました。ただWindows版ではサイト上に記載されているように問題があるため、IEコンポーネント使用のIECaptを使うとCutyCaptと同じことが実現できました。

Linuxで使ったときのフォントが明朝になってしまう問題があったのですが、ローカルのCSSを指定する方法で綺麗なフォントになりました。詳しくは以下のページに大変詳しいです。

cutycapt の最終的な設定について - Digitune [memo]

現時点ではCutyCapt(IECapt)が良い

私が希望するキャプチャ画像を得るため、という前提ではありますが、以上に挙げた方法の中ではCutyCapt(IECapt)を使う方法が最も適切であることが分かりました。実際の使用では以下のようなシェルスクリプトを書き、cronで適当に回しているという感じです。画像を蓄積するには、ファイル名に日付や時刻を含んだ方がいいと思います。

#!/bin/sh
xvfb-run --server-args="-screen 0, 1366x768x24" /usr/bin/cutycapt --url="http://www.yahoo.co.jp/" --out=capture.png --user-style-path=font_modify.css --delay=5000

キャプチャした画像の利用方法についてはいろいろ考えられると思いますが、それは別の機会に書けたらなと思います。

Powered by はてなブログ