You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AnyEvent模块结合自定义函数并行抓取多网页信息?

使用AnyEvent并行抓取多网页的完整实现方案

你正在尝试用Perl的AnyEvent模块并行获取多个网页内容,参考的示例代码还存在未完成的部分和需要完善的细节,我来帮你补全代码并解决常见的实现问题:

首先先看你的初始代码框架:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use AnyEvent;
use AnyEvent::HTTP;
my @urls = qw( https://perlmaven.com/ https://cn.perlmaven.com/ https://br.perlmaven.com/ );
my $cv = AnyEvent->condvar;
foreach my $url (@urls) {
    print "Start $url\n";
    $cv->begin;
    http_get $url, sub {
        my ($html) = @_;
        print ...
    };
}

这段代码的核心问题在于:

  • 回调函数只提取了$html,忽略了响应头和错误状态的处理
  • 没有调用$cv->end来标记单个请求完成,会导致程序一直阻塞
  • 未处理请求失败的情况(比如网络错误、HTTP状态码非200)

补全并优化后的完整代码

#!/usr/bin/perl
use strict;
use warnings;
use AnyEvent;
use AnyEvent::HTTP;

# 要抓取的URL列表
my @urls = qw( https://perlmaven.com/ https://cn.perlmaven.com/ https://br.perlmaven.com/ );

# 初始化条件变量,用于等待所有并行请求完成
my $cv = AnyEvent->condvar;

foreach my $url (@urls) {
    print "开始抓取: $url\n";
    # 标记一个新的任务开始
    $cv->begin;
    
    # 发起HTTP GET请求
    http_get $url, sub {
        my ($html, $headers) = @_;
        my $status = $headers->{Status};
        
        if ($status == 200) {
            # 请求成功,处理返回的HTML内容
            my $content_length = length $html;
            print "抓取成功: $url | 内容长度: $content_length 字节\n";
            # 这里可以添加你的业务逻辑,比如解析HTML、提取信息等
            # 例如使用HTML::TreeBuilder来解析:
            # use HTML::TreeBuilder;
            # my $tree = HTML::TreeBuilder->new_from_content($html);
        } else {
            # 请求失败,输出错误信息
            print "抓取失败: $url | HTTP状态码: $status | 原因: $headers->{Reason}\n";
        }
        
        # 标记当前任务完成
        $cv->end;
    };
}

# 等待所有并行请求完成
$cv->wait;
print "所有网页抓取任务已完成\n";

关键细节解释

  • 条件变量(condvar)的作用:$cv->begin和$cv->end是一对计数器,每调用一次begin计数器加1,end则减1,当计数器归0时,$cv->wait会结束阻塞,程序继续执行。
  • 回调函数的参数:http_get的回调函数接收两个参数,$html是响应内容,$headers是包含HTTP状态码、响应头信息的哈希引用,必须通过它来判断请求是否成功。
  • 错误处理:通过$headers->{Status}判断HTTP状态码,非200的情况都视为请求失败,同时可以通过$headers->{Reason}获取错误原因。
  • 并行执行逻辑:循环中发起的每个http_get都是异步的,不会阻塞后续请求的发起,所有请求会并行执行,直到全部完成。

内容的提问来源于stack exchange,提问作者AbhiNickz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:01:23