我在Windows XP上使用Strawberry Perl下载多个html页面,我希望每个页面都有一个变量。
现在我正在这样做,但正如我所看到的,它一次只能获得一页:
my $page = `curl -s http://mysite.com/page -m 2`;
my $page2 = `curl -s http://myothersite.com/page -m 2`;
我查看了Parallel :: ForkManager,但无法使其工作。
还尝试在start
之前使用windows命令curl
但是没有获取页面。
有更简单的方法吗?
答案 0 :(得分:3)
Parallel::ForkManager
模块应该适合您,但因为它使用fork
而不是线程,所以父进程和每个子进程中的变量是分开的,它们必须以不同的方式进行通信。 / p>
此程序使用-o
的{{1}}选项将页面保存在文件中。例如,curl
的文件保存在文件http://mysite.com/page
中,并可由父进程从那里检索。
http\mysite.com\page
<强>更新强>
这是一个使用threads
和threads::shared
将每个页面返回到所有线程之间共享的哈希的版本。散列必须标记为共享,并在修改之前锁定,以防止并发访问。
use strict;
use warnings;
use Parallel::ForkManager;
use URI;
use File::Spec;
use File::Path 'make_path';
my $pm = Parallel::ForkManager->new(10);
foreach my $site (qw( http://mysite.com/page http://myothersite.com/page )) {
my $pid = $pm->start;
next if $pid;
fetch($site);
$pm->finish;
}
$pm->wait_all_children;
sub fetch {
my ($url) = @_;
my $uri = URI->new($url);
my $filename = File::Spec->catfile($uri->scheme, $uri->host, $uri->path);
my ($vol, $dir, $file) = File::Spec->splitpath($filename);
make_path $dir;
print `curl http://mysite.com/page -m 2 -o $filename`;
}