
Gungho.ja - 高性能Webクローラーフレームワーク

use Gungho; Gungho->run($config);

Gunghoは高性能Webクローラーフレームワークです。高速なHTTP処理を行いつつ、 機能拡張をしやすいようフレキシブルな構造を目指して開発されています。
現在Gunghoはβ版です。機能的/仕様的にも比較的安定しつつありますが、まだ 内部的なAPI等は大幅な変更が加わる可能性がありますのでご注意ください。
Gunghoをインストールすると自動的に以下の機能が使えるようになります:
GunghoはPOE、Danga::Socket、IO::Async等をベースにした非同期エンジンを使い クロールを行います。あなたのニーズにあったエンジンを選んでください。
HTTP通信が非同期で行われるならもちろんDNS通信も非同期で行えます。 GunghoはDNS解決をしている間もブロックせずに他の処理を進められます。
全てのクローラーはrobots.txtを正しく処理し、禁止されているURLにはアクセス しないようにするべきです。Gunghoはこのrobots.txt処理という比較的面倒な 処理を自動的に行います。memcachedとともに使用すれば分散環境でも使用可能です。
ロボットディレクティブはHTMLのMETAタグ内に埋め込まれたロボット用の制御構文 です。Gunghoではこのディレクティブを自動的にパースし、ユーザーが扱えるように します。
クロール対象となっているサイトに過度の負荷をかけてサイトを落としては元も子も ありません。スロットリングモジュールを使う事によってGunghoではリクエスト数を 絞り込む事が可能です。
クロールしているサイトのDNSの設定が間違っていたり、意図的にそのようなURLを 埋め込んであった場合リクエストが自分の内部ネットワークのIPアドレスに向いてしまい DoSを引き起こす可能性があります。Gunghoはこのセキュリティリスクを自動的に監視します。
Catalystキャッシュのようなキャッシュを使いたい場合はCacheコンポーネントを 使用するだけでプログラム内からキャッシュを扱えるようになります。
Web::ScraperをGungho内から簡単に扱えるようにしています (この機能は現在まだ安定稼働していません)
RequestLogプラグインを使用することによって自動的に取得されていくURLを 記録して行く事ができます。

最初はまずRSSフィードを読み込むスクリプトが数個存在しました。しかしクロールする サイトが増える度に同じような処理を行う必要があり、同様にメンテナンスも難しく なってきました。この時点でクローラーのフレームワーク化が構想としてうかびあがり ました。
その後Xangoというフレームワークを開発し、イベント型クローラーの骨組みを作り あげることができました。ただしこのフレームワークはPOEというイベントフレーム ワークを使用することにこだわってしまったため、拡張性の低いフレームワークと なってしまいました。
そして2007になって過去の教訓やCatalyst, Plagger, DBIx::Class等の事例を経て 新たに手に入れた知識を素に開発されたのがGunghoです。Gunghoはイベント型 クローラーの基本構造を崩さず、拡張性に主眼を置いた設計を目指しています。
Gunghoは現在日米数社のプロジェクトで採用されており、一日に数百万件の ページを取得するコンポーネントとして活躍しています。

Gunghoは膨大な量のHTTP接続をすることを念頭に設計されています。Providerと Handlerの実装によってはDoS攻撃のような量のリクエストをサーバーに送信する事も 容易です。
上記の理由から*必ず*発行するリクエスト数に注意してクローラーを動かして ください。Gungho::Component::ThrottleによるスロットリングyGungho::Component::RobotRules によるアクセス制御は必ず組み込むようにすると良いでしょう。
また、User Agent名は必ず開発されているクローラーの適切なものに変更するよう お願いします。

Gunghoは主に3つのコンポーネントで構成されています。Engineは全てのリクエスト サイクルを統括し、サーバーへの接続、リクエストの送信等を行います。 Providerは取得すべきURLを指定し、Gungho::RequestをEngineに投げます。 HandlerはEngineが取得したレスポンスを処理します。

Gunghoは膨大な数のURLを恒常的に取得するために設計されています。もし GunghoをひとつのURL、もしくはひとつのホストに対して扱うのであれば注意を 要します。
上記のような環境でGunghoを動かす場合は十分なパフォーマンスが出せない可能性が 高く、LWP::UserAgentのようなモジュールを使用したほうがパフォーマンスを出せる 場合もあります。
もちろんLWP::UserAgentには存在しないGunghoの機能を使用するためにGunghoを 使うのもよいかも知れませんが、チューニングが必要であることを認識しておいて ください

--- debug: 1
デバッグフラグを有効にするとログの出力が全てデバッグレベルまでの出力と なります。その他コンポーネント毎にデバッグ状態の挙動に変更するものもあります。

Gunghoの機能拡張を行うにはComponentを作成します。 ComponentはGunghoを走らせる段階で指定します:
Gungho->run({
components => [
'Throttle::Simple'
],
throttle => {
max_interval => ...,
}
});
Componentを指定することによってGungho内部のクラス構造が書き換えられ、 継承による機能拡張が行われます。
各コンポーネントの詳細についてはそれぞれのドキュメントを参照してください

それほど複雑でないクローラーを実装する場合はGungho::ProviderやGungho::Handlerを わざわざ継承する必要はありません。単純にproviderとhandlerに関数を指定してください
Gungho->run({
provider => sub { ... },
handler => sub { ... }
});

GunghoプラグインはGunghoの継承ツリーに影響を及ぼさずに機能拡張を行います。 ただし、プラグインはイベント発生時のコールバックにより実装されているので、 呼び出し可能なタイミングが前もって決まっています。
詳細についてはプラグインのドキュメントを参照してください。

Used for Class::C3::Componentised

コードはGoogle Codeで管理されています。レポジトリは以下URLに保管されています
http://gungho-crawler.googlecode.com/svn/trunk

Copyright (c) 2007 Daisuke Maki <daisuke@endeworks.jp>


This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.