
XangoはPerlで書かれた汎用クローラーフレームワークです。
イベント型フレームワークPOEを使用することにより高速なクローリングが可能です。
実装にもよりますが、単一プロセス内でインデックシングや文字コードの変換等の処理を
同時に行うアプリケーションでも1秒に5~8 URL、1時間で 18000 ~ 22000 URLの処理が行えます。
ドキュメントはperldocのみっぽいので、日本語の情報を残す意味で使い方のメモをば。
相当端折って書いてます。
Xangoを使ったクロウラーを書くには、制御用のにPOEセッションを作る必要があります。
Xangoを制御するためのモジュールを適当な名前で作っておくのがスマートかと思います。
とりあえずセッション作成を行う処理を書きます
sub spawn
{
my $class = shift;
my %args = @_;
my %heap = (
);
POE::Session->create(
heap => \%heap,
package_states => [
$class => [
qw(_start _stop),
qw(retrieve_jobs apply_policy prep_request),
qw(handle_response finalize_job),
]
]
);
}
次にAliasの設定です。ユーザー側のセッション名はhandlerをつけると事になっているので、Aliasをこれに設定しておきます。
sub _start
{
my($kernel) = @_[KERNEL];
$kernel->alias_set('handler');
}sub _stop
{
my($kernel) = @_[KERNEL];
$kernel->alias_remove('handler');
}
次は、URLリストの取出しです。
XangoがURLリストの取得が必要だと判断した時にretrieve_jobs()を呼び出しますので、URLのリストを返します。
訪問先URLリストが無ければundefを戻せばおk
sub retrieve_jobs
{
print "retrieve_jobs: $count\n";
$count++;
#return undef;
return ({
uri => 'http://example.jp/',
my_var => $count,
my_other_var => $count,
},{
uri => 'http://2.example.jp/',
my_var => $count,
my_other_var => $count,
}
);
}
次に、Xangoが訪問先のURLにアクセスを行うべきかを問い合わせます。
robots.txtに基づくアクセス制御や、同一ホストに連続でアクセスすることを防止する処理を書く感じです。
sub apply_policy
{
my($kernel, $job) = @_[KERNEL, ARG0];#$job->{uri}
#$kernel->post('broker', 'finalize_job', $job); #deny
$kernel->post('broker', 'send_fetcher', $job); #any
}
次に、HTTPリクエストを実行する直前に呼ばれる処理です。
sub prep_request
{
my($kernel, $job, $req) = @_[KERNEL, ARG0, ARG1];
}
いよいよ、取得したデータを処理するフェーズです。
sub handle_response
{
my($kernel, $job) = @_[KERNEL, ARG0];
#$job->{http_response}
# $kernel->post('broker', 'finalize_job', $job);
}
最後に、HTTPリクエストの後処理です。必要だったら書いてください。
sub finalize_job
{
my($kernel, $job) = @_[KERNEL, ARG0];
}
オマケとして、設定ファイル処理中にXangoから呼び出しがあります。
sub load_config
{
my($kernel, $config_filepath) = @_[KERNEL, ARG0];
}
HttpComponentArgs:
Agent: Xango/test
MyConfigParam: hoge
最後に実行するスクリプトです。
use strict;
use Xango;
use Xango::Broker;
use MyHandler;MyHandler->spawn();
Xango::Broker->spawn(conf => './conf');
POE::Kernel->run();
と、こんな感じでXangoを使うことが出来ました。
昔のバージョンだとリンク解析とかEncodeとかrobots.txtとか色々面倒見てくれた気もするけど
現在は、貰ったURLリストをPOEらしくパラレルで高速に巡回する事に徹したフレームワークになっています。(DNSキャッシュを内部で行っているというのもいい感じです。)
その分、サーバ毎のアクセス間隔やrobots.txtへの準拠はキッチリと書かないといけないですが。
POEを使ったクロウラーたんを書きたい時には重宝しそうです。
あとはXangoX::* or Xango::Ex::* なモジュールが増える事に期待。
一応、今回のファイルもあげておくテスト。
MyHandler.pm
test.pl
conf
私もSennaとの組み合わせで使いたくて、Xangoを調べています。
何故か、Yappoさんの書いたXango使ったクロウラーのソースコードファイルがリンク切れで取得できません。残念。
ところで、オープンソースで今、一番お勧めのクローラーって何でしょうか?
たくさんあるけど、いったいどれが良いのか。。。
そもそも、検索エンジンの類って、対象技術を知っている人がすごく少ないし。
Yappoさんは最先端ですね!
訂正です。
サンプルソース、取れました。
何故か、コメントポストしたらリンク先にアクセスできるようになりました。
ブラウザがおかしいのかな。
たまたまPOEでクロウラーを作る需要があったのでXangoを見てみた感じなのです。
クロウラー回りは案件ごとに実装したい内容がだいぶ変わるから
できもののを使うよりかは独自で書いたほうがよい感じです。
Xangoくらいのフレームワークを使いつつ書くのがちょうどよさそうです。
有りもの使うんならwgetとかでもよさそうです
Posted by: Yappo at 2005年08月18日 20:37Yappoさん、コメント返しありがとうございます。
YappoさんのサンプルをベースにXangoの動作確認をしてみました。
一部の関連するCPANモジュールのインストールで梃子摺りましたが、何とか動作させられました。
Xangoってフレームワークというだけあって、ビルトインで使えるというわけではなく、大部分の処理を自分で書かなければいけないんですね。
その分、自由度が高いわけですが。
使い込んで慣れていけば、一番よさそうかも。
でも、手っ取り早くクローラーを用意するならwgetなんでしょうかね。。。