0

我有一个巨大的网页,大约 5G 大小。我希望我可以直接(远程)阅读网页的内容,而无需下载整个文件。我已使用Open文件处理程序打开 HTTP 内容。但给出的错误信息是No such files or directory. 我尝试使用LWP::Simple,但如果我使用get全部内容,则内存不足。我想知道是否有一种方法可以open远程读取这些内容,并逐行阅读。谢谢您的帮助。

4

2 回答 2

0

您可以尝试使用 LWP::UserAgent。该request方法允许您指定一个 CODE 引用,它可以让您在数据进入时对其进行处理。

#!/usr/bin/perl -w

use strict;
use warnings;

use LWP::UserAgent ();
use HTTP::Request ();

my $request = HTTP::Request->new(GET => 'http://www.example.com/');
my $ua = LWP::UserAgent->new();

$ua->request($request, sub {
        my ($chunk, $res) = @_;
        print $chunk;
        return undef;
});

从技术上讲,该函数应该返回内容而不是 undef,但如果您返回 undef,它似乎可以工作。根据文档:

“内容”函数应在调用时返回内容。content 函数将被重复调用,直到它返回一个空字符串来表示没有更多内容。

我没有在大文件上尝试过这个,您需要编写自己的代码来处理以任意大小的块传入的数据。

于 2013-01-31T06:10:14.927 回答
0

如果文件已部分下载,此 Perl 代码将从 URL 下载文件并可能继续。

此代码要求服务器content-length根据请求返回文件大小(aka )HEAD,并且还要求服务器支持相关 URL 的字节范围。

如果您想对下一个块进行一些特殊处理,只需在下面覆盖它:

use strict;
use LWP::UserAgent;
use List::Util qw(min max);

my $url  = "http://example.com/huge-file.bin";
my $file = "huge-file.bin";

DownloadUrl($url, $file);

sub DownloadUrl {
    my ($url, $file, $chunksize) = @_;
    $chunksize ||= 1024*1024;
    my $ua = new LWP::UserAgent;
    my $res = $ua->head($url);
    my $size = $res->headers()->{"content-length"};
    die "Cannot get size for $url" unless defined $size;
    open FILE, ">>$file" or die "ERROR: $!";      
    for (;;) {
        flush FILE;
        my $range1 = -s FILE;        
        my $range2 = min($range1 + $chunksize, $size);
        last if $range1 eq $range2;
        $res = $ua->get($url, Range => "bytes=$range1-$range2");
        last unless $res->is_success();
        # process next chunk:
        print FILE $res->content();
    }
    close FILE;
}
于 2013-01-31T08:00:53.573 回答