いまどきmechanize も流行らないとおもうけど、PhantomJSはあれだし、Dom構築は面倒だし。まだ数年は使えると思ってる。
Mechanize に拡張して、キャッシュする
pageをGETするたびに、ページのHTMLと、Cookieと、Mechanize::Pageを保存しておいきます。
保存しておいてあとで纏めて解析すれば早いよね。
このようにしておけば、HTMLをどんどん保存しておいて、あとで解析だけをできるので便利ですね。
#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 = 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
などとやっておけば、とりあえず、履歴や途中経過を保存しながらスクレーパーを簡単に作ることが出来ますね。