使用Perl中的WWW :: Mechanize取消下载

时间:2014-01-14 15:54:19

标签: perl www-mechanize

我编写了一个Perl脚本,它会检查URL列表并通过发送GET请求连接到它们。

现在,假设其中一个网址的文件非常大,例如尺寸大于> 100 MB。

发送请求时使用以下命令下载此文件:

$mech=WWW::Mechanize->new();
$url="http://somewebsitename.com/very_big_file.txt"
$mech->get($url)

发送GET请求后,它将开始下载文件。我希望使用WWW :: Mechanize取消它。我怎么能这样做?

我在这里检查了这个Perl模块的文档:

http://metacpan.org/pod/WWW::Mechanize

然而,我找不到可以帮助我做到这一点的方法。

感谢。

1 个答案:

答案 0 :(得分:6)

中止GET请求

使用:content_cb选项,您可以为get()提供回调函数,该函数将针对从服务器接收的每个响应内容块执行。您可以使用:read_size_hint选项设置 * 块大小(以字节为单位)。这些选项记录在LWP::UserAgent中(WWW中的get() :: Mechanize只是LWP :: UserAgent中相同方法的重载版本。)

在读取1024字节的响应内容后,将中止以下请求:

use WWW::Mechanize;

sub callback {
    my ($data, $response, $protocol) = @_;

    die "Too much data";
}

my $mech = WWW::Mechanize->new;

my $url = 'http://www.example.com';

$mech->get($url, ':content_cb' => \&callback, ':read_size_hint' => 1024);

print $mech->response()->header('X-Died');

输出:

Too much data at ./mechanize line 12.

请注意,回调中的die不会导致程序本身死亡;它只是在响应对象中设置X-Died标头。您可以向回调中添加适当的逻辑,以确定应在何种条件下中止请求。

如果内容太大,甚至不提取URL

根据您的评论,听起来像真正想要的是,如果内容太大,就不会首先发送请求。这与中途中止GET请求完全不同,因为您可以使用Content-Length请求获取HEAD标头,并根据值执行不同的操作:

my @urls = qw(http://www.example.com http://www.google.com);

foreach my $url (@urls) {
    $mech->head($url);

    if ($mech->success) {
        my $length = $mech->response()->header('Content-Length') // 0;

        next if $length > 1024;

        $mech->get($url);
    }
}

请注意,根据HTTP spec,应用设置Content-Length标头。这并不意味着他们(因此我的代码示例中的默认值为0)。


*根据文档,“协议模块将尝试以这种大小的块来从服务器读取数据”,但我不认为这是保证。