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

Neo*_*ash 0 perl www-mechanize

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

现在,让我们说其中一个URL有一个非常大的文件,例如,大小> 100 MB.

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

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

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

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

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

但是,我找不到可以帮助我做到这一点的方法.

谢谢.

Thi*_*Not 6

中止GET请求

使用该:content_cb选项,您可以提供一个回调函数,get()该函数将针对从服务器接收的每个响应内容块执行.您可以使用该选项设置*块大小(以字节为单位):read_size_hint.这些选项记录在LWP :: UserAgent中(get()在WWW :: 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');
Run Code Online (Sandbox Code Playgroud)

输出:

Too much data at ./mechanize line 12.
Run Code Online (Sandbox Code Playgroud)

请注意,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,根据HTTP规范,应用程序应设置Content-Length标头.这并不意味着他们会(的就是默认值0在我的代码示例).


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