Mechanize+Rubyを使ってみるテスト さくらのメンテ・障害情報を拾ってくる

Mechanizeを使ってみよう

Mechanizeというブラウザのエミュレータのようなライブラリがあり、nokogiriの成分も含んでいるので、スクレイピングにもたまに用いられているクールなライブラリのようです。
ブラウザのというだけの事はあって、フォームへのポストやSSL証明書の取得なんかもできるようです。

機能はいろいろあるけれど

ちょこっと使ってみようと思っただけなので、スクレイピングだけやりますw

何やるの

タイトルの通り「さくらのメンテ・障害情報」を拾ってこようと思います。

ここですね。

screen001

 

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回インクリメントを書くのを忘れていて、アタックのようになってしまいました。すみません。

jiro002

壁紙はなぜベストを尽くさないのかの上田次郎先生です。

こないだ立ち読みした本に書いてあった「作る必要のないものは作らない」という言葉にムムムと考えさせられたので、今回の日記はアップするかどうか悩みました。
いくらMechanizeのテストだからといっても、意味がなさすぎだろうと。

はっきり言って

ブックマークしていた方が120%いいと思います!

 

しかし

サーバーが落ちたかな?って時にタタンとそのままCUIで障害情報が出ていないか確認するときには使えるんじゃないか?と思っていたところで

www212.sakura.ne.jp ~ www216.sakura.ne.jp

こういう表記はGUIなら良いですが、スクレイピングして自分の使っているサーバーが対象かどうか調べようと思ったらズラズラと並んでいた方がいいですね。

 

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *