Mechanizeを使ってみよう
Mechanizeというブラウザのエミュレータのようなライブラリがあり、nokogiriの成分も含んでいるので、スクレイピングにもたまに用いられているクールなライブラリのようです。
ブラウザのというだけの事はあって、フォームへのポストやSSL証明書の取得なんかもできるようです。
機能はいろいろあるけれど
ちょこっと使ってみようと思っただけなので、スクレイピングだけやりますw
何やるの
タイトルの通り「さくらのメンテ・障害情報」を拾ってこようと思います。
ここですね。
Mechanizeのこと
ざっくりと説明をしていきたいと思います。
ライブラリを呼び出して、エージェントを作ります。
require 'mechanize' agent = Mechanize.new
ユーザーエージェントの作成。
agent.user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
URLを設定します。後から選択できるように引数にとるようにしました。
all | rs | vps | ss | idc |
と文字列が使えました。
url = "http://support.sakura.ad.jp/mainte/?service=#{ARGV[0]}" page = agent.get(url)
でもってこの辺が通常の?スクレイピングだけのライブラリと違う部分のようで(多分)リンクの要素を選択して、その先のHTMLを引っ張れます。
下のスニペットは、引数で何番目の要素かを取り、そのリンク先のDIVタグのtxt-blockというところのテキストデータを引っ張ります。というものになっています。
この部分はnokogiriのはずです。
number = ARGV[1] link = page.links[number.to_i].click mess = link.search('//div[@class="txt-block"]').text
要素から空ならぬるぽ(Rubyはnilもオブジェクトですが、お遊びです)、あったら返すという感じ。
if mess == "" then puts "ぬるぽ" exit 1 else puts mess
色々と調べてみると
まずメンテ・障害情報のページは2個に分割されています。
現在発生中の情報(12時間前後)
メンテナンス予定の情報
32個目の要素が現在発生中の情報にあたるようです。で、メンテナンス予定の情報の要素までに必ずぬるぽが1回入ります。
それを踏まえると32番目の要素からぬるぽまでループさせれば現在発生中の情報は引っ張ってこれますね。
1個だけ取ってくるケースだと、こんな感じに引っ張ってこれます。<pre>なのでCUIでも、Webのそのままが出るようですね。
[takeken@centos /home/takeken/mainteview]$ ruby view.rb rs 32 メンテナンス・障害情報・機能追加|さくらインターネット公式サポートサイト 2015年02月27日掲載 障 害 発 生 の お 知 ら せ さくらインターネット株式会社 平素よりさくらインターネットをご利用いただき、誠にありがとうござ います。 本日、ご提供サービスにおきまして、以下の通り障害が発生いたしました。 ご利用中のお客様には大変ご迷惑をおかけいたしましたことを深くお詫び 申し上げます。 < 記 > 発生日時 : 2015年02月27日03時36分~2015年02月27日04時32分 影響範囲 : さくらのレンタルサーバの一部 ホスト名が下記の範囲のお客様 www212.sakura.ne.jp ~ www216.sakura.ne.jp 障害内容 : サーバに接続できなくなる障害が発生しました。 --------------------------------------------------------------------- 追 記 : 復旧作業が完了しました。 以上
ソース
[takeken@centos /home/takeken/mainteview]$ cat view.rb #! /usr/bin/env ruby # encoding: utf-8 require 'mechanize' number = ARGV[1] agent = Mechanize.new agent.user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' url = "http://support.sakura.ad.jp/mainte/?service=#{ARGV[0]}" page = agent.get(url) link = page.links[number.to_i].click mess = link.search('//div[@class="txt-block"]').text puts link.title if mess == "" then puts "ぬるぽ" exit 1 else puts mess end
上のは企画単体物で、取得部分をループにしました。
require 'mechanize' agent = Mechanize.new agent.user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' url = "http://support.sakura.ad.jp/mainte/?service=#{ARGV[0]}" page = agent.get(url) (32..40).each do |number| link = page.links[number.to_i].click mess = link.search('//div[@class="txt-block"]').text puts link.title if mess == "" then puts "ぬるぽ" exit 1 else puts mess number+=1 end end
テキストだとループの表示が分からないので、現在発生中のものを一括で取ってみたものの一部をキャプチャしました。こんな感じでずらずらと表示されて、最後にぬるぽと出ます。
1回インクリメントを書くのを忘れていて、アタックのようになってしまいました。すみません。
壁紙はなぜベストを尽くさないのかの上田次郎先生です。
こないだ立ち読みした本に書いてあった「作る必要のないものは作らない」という言葉にムムムと考えさせられたので、今回の日記はアップするかどうか悩みました。
いくらMechanizeのテストだからといっても、意味がなさすぎだろうと。
はっきり言って
ブックマークしていた方が120%いいと思います!
しかし
サーバーが落ちたかな?って時にタタンとそのままCUIで障害情報が出ていないか確認するときには使えるんじゃないか?と思っていたところで
www212.sakura.ne.jp ~ www216.sakura.ne.jp
こういう表記はGUIなら良いですが、スクレイピングして自分の使っているサーバーが対象かどうか調べようと思ったらズラズラと並んでいた方がいいですね。