我有一个巨大的网页,大小约为5G。我希望我可以直接(远程)阅读网页内容而无需下载整个文件。我使用Open
文件处理程序打开HTTP内容。但给出的错误消息是No such files or directory
。我尝试使用LWP::Simple
,但如果我使用get
整个内容,则内存不足。我想知道是否有一种方法可以远程open
这个内容,并逐行阅读。
谢谢你的帮助。
答案 0 :(得分: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”函数应在调用时返回内容。 内容函数将被重复调用,直到它返回 空字符串表示没有更多内容。
我没有在大文件上尝试这个,你需要编写自己的代码来处理以任意大小的块进入的数据。
答案 1 :(得分:0)
如果文件已经部分下载,此Perl代码将从URL下载文件并可能继续。
此代码要求服务器在content-length
请求中返回文件大小(也称为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;
}