Rioってなんだろう
Rio:http://rio.rubyforge.org/
Ruby: Net::Http and open-uri | 2006-08-13:
http://www.juretta.com/log/2006/08/13/ruby_net_http_and_open-uri/
をそれぞれ参考にしながら,Rioってヤツを試してみる.
そもそもRioって何?
Rio - Ruby I/O Comfort Class
Rio is a convenience class wrapping much of the functionality of IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, and OpenURI and uses Zlib, and CSV to extend that functionality using a simple consistent interface. Most of the instance methods of IO, File and Dir are simply forwarded to the appropriate handle to provide identical functionality. Rio also provides a "grande" interface that allows many application level IO tasks to be expressed succinctly.
全部入りってこと?
とりあえず入れる.
$ sudo gem install rio
入れたら,次にhttp://www.juretta.com/log/2006/08/13/ruby_net_http_and_open-uri/に書いてある事とか,適当に色々試してみるぞ.
ウェブページの取得,ファイルへの書き込み
require 'rubygems' require 'rio' rio('http://d.hatena.ne.jp/omochist/') > rio('mochi.html')
見た感じ,URLで指定したファイルをローカルにmochi.htmlという名前で保存するって感じだ.本当にコレで行けたら,スゲーラクチンである.実際に試してみる.
$ ruby hoge.rb $ ls hoge.rb hoge.rb~ mochi.html
「マジで落とせてるの?」と疑問に思いながらmiで開いてみると,ちゃんと落とせてて驚き.ナンダコレは,すげー楽じゃないか.
複数のウェブページの取得,ファイルへの書き込み
今度は,複数のページを配列に落とし込んでみる.(※注:以下のソースは,実行するとエラい目に遭います.)
require 'rubygems' require 'rio' # ページの取得 pages = [] rio('http://www.google.co.jp') > pages rio('http://www.yahoo.co.jp') >> pages rio('http://rio.rubyforge.org/') >> pages rio('http://www.t3.rim.or.jp/~terra/') >> pages rio('http://tksn.web.infoseek.co.jp/') >> pages # 書き込み pages.each_with_index do |page, i| rio("page#{i}.html") < page end
これで行けそうかな〜!って感じですが,行けません.どうもこのRioってのは,ページを落としてきてその一行一行を配列に追加していくので,結果1797個もの配列を作り,ご丁寧にもその一個ごとにファイルを作ってしまいます.これは正直望ましくない.ココで,
- 全部オブジェクト
- 配列はオブジェクトならある程度なんでも格納
ってのを思い出しながら,ページの取得をこんな風に変更する.
pages = [] pages << rio('http://www.google.co.jp') pages << rio('http://www.yahoo.co.jp') pages << rio('http://rio.rubyforge.org/') pages << rio('http://www.t3.rim.or.jp/~terra/') pages << rio('http://tksn.web.infoseek.co.jp/')
こうすると,ちゃんと思い通りに動いてくれる.
$ ruby hoge2.rb $ ls hoge.rb hoge2.rb mochi.html page1.html page3.html hoge.rb~ hoge2.rb~ page0.html page2.html page4.html
ウェブページのタイトルを取得
チョットした応用.正直,open-uriとか使っても十分にできる範囲ではある.
require 'rubygems' require 'rio' # chompして配列にする事もできる. # lines = rio('http://d.hatena.ne.jp/omochist/').chomp.to_a lines = rio('http://d.hatena.ne.jp/omochist/').to_a lines.each do |l| if l =~ /<title>(.*)<\/title>/ puts $1 break end end
$ ruby hoge3.rb もち
ちゃんとできてる.