本を読む

読書やコンピュータなどに関するメモ

多段のP::P::CustomFeed::Simpleを試作

 [Plagger]パイプラインというエントリを読んで、そうそう、掲示板とかをPlaggerでスクレイピングするときに、トピック一覧ページと各エントリのページの2段階になってることがあるんだよな、と思った。

 ただし私の場合、とりあえずCustomFeed::Configが多段になっていればいい。そこで、CustomFeed::Multistageというのを試作。

 使いかたはPODのとおり。Subscription::Configのmeta:で、multistage:の中に各段のfollow_linkまたはfollow_xpathを並べる。まず1行目のfolow_*でCustomFeed::Simpleと同じように処理し、そこで抽出された各URLに対して2行目のfollow_*で処理し…と続く。理論上は何段階でも続けられる。

 ただし注意が必要なのは、最終段の各ページごとにフィードが作られること。まとめて1つのフィードにするには、SmartFeedとか他の段で処理する必要がある。

 実装はなんてことない、Customfeed::Simpleを継承してラッパーとして動き、aggregate()を再帰的に呼び出しているだけ。

package Plagger::Plugin::CustomFeed::Multistage;
use strict;
use base qw( Plagger::Plugin::CustomFeed::Simple );

our $VERSION = 0.01;

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'customfeed.handle' => \&handle,
    );
}

sub handle {
    my($self, $context, $args) = @_;

    my @stagelist = @{$args->{feed}->meta->{multistage}}; # copy array
    my $meta = shift @stagelist;
    $args->{match} = $meta->{follow_link};
    $args->{xpath} = $meta->{follow_xpath};
    if ($args->{match} || $args->{xpath}) {
        $self->aggregate($context, $args) or return;
    }

    if(@stagelist){
        my $newfeed = Plagger::Feed->new;
        $newfeed->meta({ multistage => \@stagelist});
        my $newargs = { feed => $newfeed };
        my $oldfeed = pop @{$context->update->feeds};
        for my $e (@{$oldfeed->{entries}}) {
            $newargs->{feed}->url($e->link);
            $newargs->{feed}->link($e->link);
            $self->handle($context, $newargs);
        }
    }

    return;
}

1;

__END__

=head1 NAME

Plagger::Plugin::CustomFeed::Multistage - Simple way to create title and link only custom feeds (multistage version)

=head1 SYNOPSIS

  - module: Subscription::Config
    config:
      feed:
        - url: http://www.example.com/hoge/
          meta:
            multistage:
              - follow_link: archive\d+/date.html
              - follow_link: msg\d+\.html

  - module: CustomFeed::Multistage

=head1 DESCRIPTION


=head1 AUTHOR

Masakazu Takahashi

=head1 SEE ALSO

L<Plagger>

=cut


1;

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/175-05b8947c

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad