Gungho

| コメント(0) | トラックバック(0)



YAPCに触発されて新しいクローラーフレームワークに着手。まだまだ出来てない部分はあるけど、一応もう動くよ。



http://gungho-crawler.googlecode.com/svn/trunk



あとついでにPlaggerのAggregatorも書いた。Xangoではメモリではなくファイルにデータを書き出すとか、最適化をはかったけど、今回のはとにかく作り込みやすさのほうを念頭に。だから多分今のXangoより遅い+メモリは食うとは思うけど、こちらのほうがなんか明らかにコードがキレイだ。



package Plagger::Plugin::Aggregator::Gungho::Handler;
use strict;
use base qw(Gungho::Handler::Null);

__PACKAGE__->mk_accessors($_) for qw(gungho_plugin);

sub handle_response
{
my $self = shift;
my $c = shift;
my $res = shift;

$self->next::method($c, $res);
$self->gungho_plugin->handle_feed($res->request->uri, $res->content_ref);
}

package Plagger::Plugin::Aggregator::Gungho;
use strict;
use base qw(Plagger::Plugin::Aggregator::Simple);
use Gungho;
use Gungho::Request;

__PACKAGE__->mk_accessors($_) for qw(requests);

sub register
{
my ($self, $context) = @_;
$context->register_hook(
$self,
'customfeed.handle' => \&accumulate,
'aggregator.finalize' => \&aggregate,
);
$self->requests([]);
}

sub accumulate
{
my($self, $context, $args) = @_;
my $url = $args->{feed}->url;
return unless $url =~ m!^https?://!i;
$context->log(info => "Fetch $url");
push @{ $self->requests }, Gungho::Request->new(GET => $url);
}

sub aggregate
{
my ($self, $context) = @_;
my $g = Gungho->new({
provider => {
module => 'Simple'
},
handler => {
module => '+Plagger::Plugin::Aggregator::Gungho::Handler'
}
});
$g->provider()->requests( $self->requests );
$g->provider()->has_requests( 1 );
$self->requests([]);
$g->handler()->gungho_plugin( $self );
$g->run;
}

1;

Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ