はじめに
私は趣味でいろいろな高専のウェブサイトを定期的に巡回しているのですが,ここ数ヶ月はリニューアルがピークで,自動的にそれを検知してほしくなってきたため,とりあえず自動でスクリーンショットを撮ってくれるスクリプトを組みました。
環境
- MacBook Pro (Retina 13-inch、Early 2015)
- Ruby2.3.1
下準備
-
gem install selenium-webdriver
する - 環境にあった Geckodriver をダウンロードする
- 適当な場所で2.を解凍し,その場所にpathを通す
プログラム
#!/usr/bin/ruby
require 'selenium-webdriver'
require 'json'
# 日付取得
day = Time.now
# 画像ディレクトリ
image_path = "./img/#{day.strftime('%Y%m%d')}"
# ディレクトリを作成
FileUtils.mkdir_p(image_path) unless FileTest.exist?(image_path)
# urlファイル
file = File.read('url.json')
# urlファイル読みこみ
hash = JSON.parse(file, {:symbolize_names => true})
# seleniumのインスタンス生成
driver = Selenium::WebDriver.for :firefox
# スクリーンショット撮影
hash.each do |number, school|
school.each.with_index(1) do |description, count|
name = description[:name]
url = description[:url]
begin
driver.get url
driver.save_screenshot "#{image_path}/#{format('%02d', count)}_#{name}.png"
ensure
p "[Error] #{format('%02d', count)}_#{name}"
next
end
end
end
# ブラウザを閉じる
driver.quit
(勢いで書いたので決してきれいなコードではありません…)
画像の保存先や,JSONファイルのパスは適宜変更してください。
このスクリプトを実行すると, ./img/#{日付}/#{連番}_#{JSONのname}.png
が保存されます。もしもエラーがあった場合はそのウェブサイトのスクリーンショットは取得されず,コンソールでエラーが表示され,次のサイトのスクリーンショット取得フェーズに移行します。
JSONファイルの形式は以下のようにしてください。
{
"items": [
{
"name": "函館高専",
"url": "http://www.hakodate-ct.ac.jp/"
},
{
"name": "苫小牧高専",
"url": "http://www.tomakomai-ct.ac.jp/"
},
{
"name": "釧路高専",
"url": "http://www.kushiro-ct.ac.jp/"
},
{
"name": "旭川高専",
"url": "http://www.asahikawa-nct.ac.jp/"
}
]
}
まとめ
このサンプルでは愚直にスクリーンショットを取得するだけですが,Selenium界隈はまた奥が深そうですので,よりよい方法を探していきたいと思います。ちなみに現在54のサイトを巡回していますが,すべてのスクリーンショット取得に5分程度かかるため,もう少し改善したいところです(ネットワークの回線速度にも依存するでしょうが)。
さらに,Javascriptを使用しているウェブページではページ全体のスクリーンショットが取得されるのに対し,そうでないサイトでは1280*841のサイズのスクリーンショットが取得されるため,改善が必要だと思われます…。
参考
#更新履歴
2016.12.09 誤記修正(Special Thanks @scivola !!)
2016.12.08 公開