改进LWP ::简单的perl性能

Ael*_*ere 3 perl html-parsing

唉,我还有一个问题:

我的任务是阅读网页并从该页面中提取链接(HTML :: TokeParser简单易用).他(我的老板)然后坚持要求我从这些链接中读取并从每个页面中获取一些细节,并将所有这些信息解析为xml文件,以后可以读取.

所以,我可以这样简单地设置它:

#!/usr/bin/perl -w

use     strict;
use     LWP::Simple; 
require HTML::TokeParser; 

$|=1;                        # un buffer

my $base = 'http://www.something_interesting/';
my $path = 'http://www.something_interesting/Default.aspx';
my $rawHTML = get($path); # attempt to d/l the page to mem

my $p = HTML::TokeParser->new(\$rawHTML) || die "Can't open: $!";

open (my $out, "> output.xml") or die;

while (my $token = $p->get_tag("a")) {

    my $url = $token->[1]{href} || "-";

    if ($url =~ /event\.aspx\?eventid=(\d+)/) {
        ( my $event_id = $url ) =~ s/event\.aspx\?eventid=(\d+)/$1/;
        my $text = $p->get_trimmed_text("/a");
        print $out $event_id,"\n";
        print $out $text,"\n";

        my $details = $base.$url;
        my $contents = get($details);

        # now set up another HTML::TokeParser, and parse each of those files.

    }
}
Run Code Online (Sandbox Code Playgroud)

如果此页面上可能有5个链接,则可能没问题.但是,我试图从~600个链接中读取,并从这些页面中获取信息.所以,不用说,我的方法花了很长时间......老实说我不知道​​多久,因为我从来没有让它完成.

我的想法就是简单地编写一些只能根据需要获取信息的东西(例如,一个从你想要的链接中查找信息的java应用程序).​​.....但是,这似乎是不可接受的,所以我'我转向你们:)

有没有办法改善这个过程?

小智 5

如果你get()并行执行s而不是顺序执行s,你可能会看到速度提升 - 代价是不那么简单的代码.

Parallel :: ForkManager是我要开始的地方(甚至get()在其文档中包含一个LWP :: Simple 示例),但在CPAN上还有很多其他替代方法,包括相当陈旧的LWP :: Parallel :: UserAgent.