在Perl中检查10,000个博客源的有效方法

时间:2010-12-12 23:28:35

标签: perl rss lwp-useragent

我们有10,000个博客,我们想每天多次检查新帖子。我喜欢使用Perl以最有效的方式使用示例代码的一些想法。

目前,我们只是使用LWP::UserAgent下载每个RSS Feed,然后根据已找到的网址的MySQL数据库表逐一检查生成的Feed中的每个网址。毋庸置疑,这不能很好地扩展并且效率极低。

提前感谢您的帮助&咨询!

4 个答案:

答案 0 :(得分:3)

不幸的是,除了做某种民意调查之外别无他法。

幸运的是,实施PubSubHubbub protocol可以极大地帮助减少支持它的Feed的轮询量。

对于那些不支持PubSubHubbub的Feed,您必须确保使用HTTP级协议(如ETagsIf-Modified-Since标头来了解资源是否/何时更新)。 还要确保实现某种退避机制。

答案 1 :(得分:2)

或许查看AnyEvent::Feed,它是异步的(使用AnyEvent事件循环),具有可配置的轮询间隔,以及对“看到”文章的内置支持,以及对RSS和Atom提要的支持。您可以创建一个流程轮询每个Feed或多个流程轮询Feed列表的不同部分。

从概要:

      use AnyEvent;
      use AnyEvent::Feed;

      my $feed_reader =
         AnyEvent::Feed->new (
            url      => 'http://example.com/atom.xml',
            interval => $seconds,

            on_fetch => sub {
               my ($feed_reader, $new_entries, $feed, $error) = @_;

               if (defined $error) {
                  warn "ERROR: $error\n";
                  return;
               }
               for (@$new_entries) {
                     my ($hash, $entry) = @_;
                     # $hash a unique hash describing the $entry
                     # $entry is the XML::Feed::Entry object of the new entries
                     # since the last fetch.
               }

            }
         );

答案 2 :(得分:0)

似乎有两个问题集合在一起:取一个比较。其他人已经回答了获取部分。至于比较:

  • 我最近一直在阅读关于redis的内容,它似乎非常适合你,因为它可以每秒执行很多简单的操作(比如说〜80k / s)。所以检查你是否已经有一个网址应该非常快。从来没有实际使用它;)

  • 一个想法:在解析RSS之前,您是否尝试过比较大小?如果不经常更改,可能会节省一些时间。

答案 3 :(得分:0)

10000不是那么多。

然后你可以使用一些简单的方法处理,比如分配从db获取RSS URL的一些工作进程,获取它们并更新数据库:

for (1..$n) {
  my $pid = fork;
  if (!$pid) {
     defined $pid or die "fork failed";
     my $db = open_db();
     while (1) {
       $url = get_next_url($db) or last;
       $rss = feed_rss($url);
       update_rss($db, $rss);
     }
     exit(0);
  }
}
wait_for_workers(@pid);

考虑到你无法使用其他响应者已经指出的一些现有应用程序。