ワックスかける!ワックスとる!
ベストキッドという映画をご存知でしょうか。
有名な映画なのでご存知の方も多いでしょう。主人公の男の子が、ミヤギから空手を教わる時にいろいろな修行をするのですが、その中でも有名なのが
ワックスかける!ワックスとる!
というものがあります。このフレーズだけ知ってる!という人も居るかもしれませんね。
ひたすらこのワックスかける!ワックスとる!という動作を繰り返す修行(だったと思う)なのですが、この動作を繰り返しているうちに気づいたら空手が強くなってる!という話でした。
プログラムもある程度のレベルまではひたすら書いていると上達すると思うので、ベストキッドのように反復練習もいいのではないかな?と思ってこのタイトルにしてみました。
スクレイピングする! 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