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;