それマグで!

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

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

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

いまどきmechanize も流行らないとおもうけど、PhantomJSはあれだし、Dom構築は面倒だし。まだ数年は使えると思ってる。

Mechanize でサイトのスクレーパーの手順は

  1. irb でmechanize 起動
  2. ページに移動
  3. ページに移動してからCSSを探す

の手順が王道なんですが。コレが面倒です。

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


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