Botchは簡単にウェブクローラーを記述するためのDSLのようなものです。
Sinatraを参考にしています。
Gemfileにgem 'botch'
と書いてbundle installするか、あるいはCUI上でgem install botch
と叩くことでインストールできます。
原則的にはSinatra::Baseのように、Botch::Baseクラスを継承して使います。
将来的にはSinatraのClassicスタイルのような実装もされる可能性があります。
SampleBotch内のfilter,rule,get,post,runに渡されるブロックでは、共通のインスタンス変数を定義して利用することができます。
require 'botch'
class SampleBotch < Botch::Base
end
setメソッドをクラス内部で使うことで、UserAgentやクライアント、その他オプション等を設定できます。
オプション一覧
- :user_agent - UserAgentの設定です。UserAgentに設定したい値を文字列で指定します。
- :disabled_invalid - boolで指定します。filterメソッドに渡されたブロックの戻り値がfalseだった場合、(run|get|post)メソッドにおいてスルーされるようになります(後述)。
- :client - 現在は:faradayか:mechanizeしか選択できません。デフォルトは:faradayとなっています。
- それ以外のオプションについては、Faraday、Mechanizeにおける(get|post)メソッドのオプションとして渡されます。
class SampleBotch < Botch::Base
set :user_agent, "サンプルボッチ"
set :client, :mechanize
set :disabled_invalid, true
end
このメソッドに渡されるブロックの戻り値によって、(rule|get|post)メソッドに渡されるブロックの第二引数が変わります。
また、mapオプションが指定された場合には、URLに対して部分一致を行い、一致したものにのみ実行されます。
class SampleBotch < Botch::Base
filter(:all){ true }
get("http://namusyaka.info/") do |response, valid|
puts valid #=> true
end
filter(:all){ false }
get("http://namusyaka.info/") do |response, valid|
puts valid #=> false
end
end
ただし、:disabled_invalidにtrueを設定した場合は挙動が変わります。
本来、validがfalseになるURLについては実行されずに終了します。
class SampleBotch < Botch::Base
set :disabled_invalid, true
filter(:all){ true }
get("http://namusyaka.info/") do |response, valid|
puts response.class # Faraday::Response
end
filter(:all){ false }
get("http://namusyaka.info/") do |response, valid|
puts response.class # 実行されずに終了
end
end
このメソッドに渡されるブロックの戻り値で、responseの内容を書き換えていきます。
また、mapオプションが指定された場合には、URLに対して部分一致を行い、一致したものにのみ実行されます。
class SampleBotch < Botch::Base
rule :all, :map => "namusyaka.info" do
"replaced"
end
get("http://namusyaka.info/") do |response, valid|
puts response #=> "replaced"
end
end
URLを渡して実際にGETメソッドでHTTPリクエストを飛ばします。
getメソッドにはURLを可変長引数として渡します。同時にブロックを渡すこともできます。
class SampleBotch < Botch::Base
get("http://namusyaka.info/") do |response, valid|
puts response.class #=> Faraday::Response
puts valid #=> true
end
end
getと違い、POSTメソッドでHTTPリクエストを飛ばします。
渡す引数などに変更はありません。
getのエイリアスです。
- settings
- options
- client
- body
- header
- status