こんな感じに書いて動かしているところです.
agent = WWW::Mechanize.new {|a| a.log=Logger.new('access.log')}
while # どんどんデータを集める!
begin
page = agent.get(url)
rescue Timeout::Error
puts " caught Timeout::Error !"
retry # タイムアウトしちゃってもあきらめない!
rescue WWW::Mechanize::ResponseCodeError => e
case e.response_code
when "404"
puts " caught Net::HTTPNotFound !"
next # ページが見付からないときは次へ
when "502"
puts " caught Net::HTTPBadGateway !"
retry # 上手くアクセスできないときはもう1回!
else
puts " caught Excepcion !" + e.response_code
retry
end
end
end
参考
最近ちょこちょこ触っているRailsの話を少しだけ書きます.検索してもあまり出てこない話なので,キーワードを散りばめつつ書いてみよう!
RailsのPagination
RailsにはPaginationという仕組みがあって,よくあるページング処理を簡単に実現できます.例えば,controller側で
# controllers/model_controller.rb
class ModelController < ApplicationController
def index
@model_pages, @models = paginate :models, :per_page => 10
end
end
と書いておくと,viewの方では
# views/model/index.rhtml
<ul>
< %- for m in @models -%>
<li>m.name</li>
< %- end -%>
</ul>
<%= link_to 'Previous page', { :page => @model_pages.current.previous } if @model_pages.current.previous %>
<%= link_to 'Next page', { :page => @model_pages.current.next } if @model_pages.current.next %>
と書くだけで1ページにper_page分ずつ表示してくれて,前後のページへのリンクも出せちゃうわけです.と,まぁここまではただのPaginationの話で,詳しい説明がWeb上にたくさんあるので見つかるでしょう.このPaginationはRails 2.0ではプラグイン扱いになるようですね!使い方が変わるでしょうから要チェックです.
link_toのhtml_option
さてさて,ページング処理を実装するようなサイトでしたら,AutoPagerizeに対応させたくなるのが人情ってもんです.そのためには次のページへのリンクに「@rel=”next”」を付与する必要があります.しかし! a タグは link_to メソッドで自動生成しているから,属性を付与できません!とか騒いでいたら,link_to メソッドには html_option なるものがありました.ちゃんとドキュメントを読めって話でした.
<%= link_to 'Next page', { :page => @model_pages.current.next }, { :rel => "next" } if @model_pages.current.next %>
こうしてやればOKです.aタグにclassやidを振りたいときにもhtml_optionが必要ですね.覚えておこう.