Mechanizeでスクレイピング!JSONデータを出力!

ワックスかける!ワックスとる!

ベストキッドという映画をご存知でしょうか。
有名な映画なのでご存知の方も多いでしょう。主人公の男の子が、ミヤギから空手を教わる時にいろいろな修行をするのですが、その中でも有名なのが

ワックスかける!ワックスとる!

というものがあります。このフレーズだけ知ってる!という人も居るかもしれませんね。
ひたすらこのワックスかける!ワックスとる!という動作を繰り返す修行(だったと思う)なのですが、この動作を繰り返しているうちに気づいたら空手が強くなってる!という話でした。

プログラムもある程度のレベルまではひたすら書いていると上達すると思うので、ベストキッドのように反復練習もいいのではないかな?と思ってこのタイトルにしてみました。

スクレイピングする! JSONで出す!

Mechanizeを使わない方法やループの方法も色々とありますので、いろんな方法で繰り返しているうちに色々と上達するでしょう。たぶん。

ではやってみよう

Mechanizeを使ってスクレイピングをするところまでは以前やりましたので、今回はJSONに出すところをやろうかと。

前回のネタ

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

今回はロリポップもやってみようと思います。

視覚的にもスクレイピングとデータ取得は別にした方が分かりやすいので、情報を取得するクラスと、利用して何かを出力するクラスという形がいいのではないかと思います。
今回は情報を取得するクラスということで。
先に言っておくと内容は意味がないよう〜なもので、お題がメンテナンスや障害情報なので、各ホスティング会社のWebを見たほうがあきらかに良いです。
ガッツリ作りこめばもっとJSONのデータも細かくできそうですが、それなりに手を抜いていますのでその辺はご了承くださし。

これはあくまで練習です。

もう1度繰り返します、これはあくまで練習です。

さくらバージョン

require 'rubygems'
require 'mechanize'
require 'json'

class Mainte
 def initialize
 # URLの情報を取得
 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=all"
 @page = agent.get(url)
 end

 def getjson
 # 指定したリンク先の情報を取得
 number = 32
 mess = "dammy"

 # 40までか空データがあれば抜ける。
 maintelist = []
 (32..40).each do |number|
 link = @page.links[number.to_i].click
 pageurl = link.uri
 pagetitle = link.search('//h1[@class="ttl-page2"]').text
 pagedescript = link.search("//pre[@class='large']").text
 maintelist << {"url" => pageurl , "title" => pagetitle , "descript" => pagedescript}
 # 空データで抜ける
 if pagedescript == "" then
 break
 end
 number += 1
 end
 return maintelist.to_json
 end
end

if __FILE__ == $0

# 使い方 兼 実行可能
test = Mainte.new
hoge = JSON.parse(test.getjson)
hoge.each {|d| puts d["title"] }
# hoge.each {|d| puts d["descript"] }

end

実行結果

$ ruby saku2.rb
[緊急]さくらVPSの一部
さくらのVPS SSD 2Gプランの一部
さくらのレンタルサーバ(www732.sakura.ne.jp)
gTLDドメイン(.info .org)

ロリポップバージョン

class Mainte
 def initialize
 # URLの情報を取得する
 agent = Mechanize.new
 agent.user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
 url = "http://lolipop.jp/info/obsta/"
 @page = agent.get(url)
 end

 def getjson
 maintelist = []
 #1枚のページでクライアントサイドのスクリプトで見るページになっているので
 #タグでループさせて各パラメタを取得 ※なんか違っているかもしれない。
 @page.search('//div[@class="info-list-inner"]').each do |hoge|
 date = hoge.search('//p[@class="info-date"]').text
 title = hoge.search('//p[@class="info-title"]').text
 hoge.search('//dd[@class="info-body"]').each {|x|
 @desc = x.search('//p').text }
 maintelist << {"date" => date , "title" => title , "desc" => @desc}
 end
 return maintelist.to_json
 end
end

if __FILE__ == $0

test = Mainte.new
hoge = JSON.parse(test.getjson)
hoge.each {|d| p d["title"]}

end

コメント欄にも書いていますが、一応それぞれのデータがとれているのですが、改行がされていないのでループでとれているのかどうか謎です。

実行結果

$ ruby loli.rb
"users303をご利用のお客様へmail022をご利用のお客様へmail014をご利用のお客様へmail017をご利用のお客様へusers305アクセスログをご利用のお客様へusers305をご利用のお客様へmysql557.phy.lolipop.jpをご利用のお客様へusers303をご利用のお客様へusers135をご利用のお客様へusers902をご利用のお客様へ"

おわりに

そもそも反復練習は、Sinatraでのウェブアプリケーションを繰り返していたんですが、データをとるところは別にやってもいいかなと思ってこの部分だけでアップすることにしました。

VPSの環境に近い環境をやっとこさローカル環境にも作って、Windows+Ubuntuで作っていた環境からMacへの移行もようやく終わったので、新しくVPSやOpenstackの作成にもとりかかれるようになりました。出来上がったらまた日記のネタにしようかと思いますのでよろしく。

宣伝

Qiitaに登録したはいいけれど、どう使おうかなぁと悩んでいたところ、プログラム関連で日記に書くには難しいようなネタや、スニペット置き場的に使うのがちょうど良いかなと。
同じ内容で別の言語で書くというのも多分はじめてですが、載せてみたらレスも頂いて、個人的には濃い内容になりました。やっぱりコミュニティは他の方の目につくのが多い分レスもいただけますね。良いことです。
と言っても、このブログとはやはり別物扱いにしていきたいので宣伝だけ!ってことで。

良かったら覗いてみてください。

Ruby – ベンチマークの簡易スクリプト – Qiita: takekentw

 

 

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です