Skip to content

Instantly share code, notes, and snippets.

@namusyaka
Last active December 19, 2015 18:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save namusyaka/6001467 to your computer and use it in GitHub Desktop.
Save namusyaka/6001467 to your computer and use it in GitHub Desktop.
botchの説明

Botch

Botchは簡単にウェブクローラーを記述するためのDSLのようなものです。

Sinatraを参考にしています。

インストール手順

Gemfileにgem 'botch'と書いてbundle installするか、あるいはCUI上でgem install botchと叩くことでインストールできます。

説明

Botch::Base

原則的にはSinatra::Baseのように、Botch::Baseクラスを継承して使います。

将来的にはSinatraのClassicスタイルのような実装もされる可能性があります。

SampleBotch内のfilter,rule,get,post,runに渡されるブロックでは、共通のインスタンス変数を定義して利用することができます。

require 'botch'

class SampleBotch < Botch::Base
end

set(key, value)

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

filter(label, options = {}, &block)

このメソッドに渡されるブロックの戻り値によって、(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

rule(label, options = {}, &block)

このメソッドに渡されるブロックの戻り値で、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

get(*urls, &block)

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

post(*urls, &block)

getと違い、POSTメソッドでHTTPリクエストを飛ばします。

渡す引数などに変更はありません。

run(*urls, &block)

getのエイリアスです。

ブロック内で実行できるヘルパー

  • settings
  • options
  • client
  • body
  • header
  • status
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment