7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

指定した複数ウェブサイトのスクリーンショットを自動で撮影(Ruby+Selenium)

Last updated at Posted at 2016-12-08

はじめに

私は趣味でいろいろな高専のウェブサイトを定期的に巡回しているのですが,ここ数ヶ月はリニューアルがピークで,自動的にそれを検知してほしくなってきたため,とりあえず自動でスクリーンショットを撮ってくれるスクリプトを組みました。

環境

  • MacBook Pro (Retina 13-inch、Early 2015)
  • Ruby2.3.1

下準備

  1. gem install selenium-webdriver する
  2. 環境にあった Geckodriver をダウンロードする
  3. 適当な場所で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 公開

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?