それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Mechanzieをirbで使ってsearchしてると手数が多いので

mechanzie でページを一旦保存する。

#coding : utf-8
require 'mechanize'
class Mechanize
     alias_method :orig_get, :get
     def get(*args)
          ret = self.orig_get(*args)
          name = Time.now.strftime("%H.%M.%S")
          ret.save("#{name}.html")
          page  = Mechanize::Page.new(ret.uri, ret.response, ret.body, ret.code)
          Marshal.dump(page, open("#{name}.dump", "w") )
          self.cookie_jar.save("#{name}.cookie_jar")
          return ret
     end
end
m = Mechanize.new
m.get ("http://mixi.jp")
puts m.page.body

pageをGETするたびに、ページのHTMLと、Cookieと、Mechanize::Pageを保存しておいきます。 保存しておいてあとで纏めて解析すれば早いよね。

このようにしておけば、HTMLをどんどん保存しておいて、あとで解析だけをできるので便利ですね。

フォームは・・・

page = Marsha.load( open("some_page.dump") );
page.mech = Mechanize.new
page.forms

とすれば、解析を再開出来ます。

もちろんPOSTの時も必要なので

#coding : utf-8
require 'mechanize'
class Mechanize
     alias_method :orig_get, :get
     def get(*args)
          ret = self.orig_get(*args)
          self.save_for_replay ret
          return ret
     end
     alias_method :orig_post, :post
     def post(*args)
          ret = self.orig_post(*args)
          self.save_for_replay ret
          return ret
     end
     def save_for_replay(ret)
          name = Time.now.strftime("%H.%M.%S")
          ret.save("#{name}.html")
          page  = Mechanize::Page.new(ret.uri, ret.response, ret.body, ret.code)
          Marshal.dump(page, open("#{name}.dump", "w") )
          self.cookie_jar.save("#{name}.cookie_jar")
     end
end


m = Mechanize.new

m.get ("http://mixi.jp")

puts m.page.body

などとやっておけば、とりあえず、履歴や途中経過を保存しながらスクレーパーを簡単に作ることが出来ますね。