【发布时间】:2015-01-16 00:29:40
【问题描述】:
我正在使用 CURL 发出数千个请求。在我的代码中,我将 cookie 设置为特定值,然后读入页面上的值。这是我的 Perl 代码:
#!/usr/bin/perl
my $site = "http://SITENAME/?id=";
my $cookie_name = "cookienum123";
print $fh "#\t\tValue\n";
for my $i ('1'..'10000') {
my $output = `curl -s -H "Cookie: $cookie_name=$i" -L $site$i | grep -Eo "[0-9]+"`;
print "$i\t\t$output\n";
}
所以从 1 到 10000,我将 cookienum123 设置为该值并从页面读取整个响应。然后我使用 grep 来提取 #.我现在的代码工作正常,但我想知道是否有更快或更有效的方法可以做到这一点。
请注意,这不必作为 Perl 脚本来完成(我也可以使用 Windows 批处理文件、Unix shell 脚本等)。
编辑 1 月 18 日:添加赏金注释“所需的答案应包括在 Perl 中同时运行数千个 curl 请求的方法,但它的运行速度需要比当前运行的速度更快。它必须写最后输出到单个文件,但顺序无关紧要。”下面的一些 cmets 提到了 fork,但我不确定如何将它应用到我的代码中。我对 Perl 很陌生,因为这是我在其中的第一个程序。
【问题讨论】:
-
如何分叉给多个孩子,比如一次可能有 20 个,这样你就可以一次运行多个?
-
Net::Curl::Multi 允许您向 curl 库发出并行请求。当然,还有 Parallel::ForkManager 破坏多个
curl进程 -
@TheJester1977 我如何分叉给多个孩子?
-
@ikegami 你有什么有趣的错字吗?
:) -
@Bijan,不,不使用
curl,因为您要确保一次只运行一个curl。如果您使用 Net::Curl::Multi,则只需在写入文件时锁定文件,这样就可以工作,但输出将是随机顺序的。因此,您希望将输出保存在内存、数据库或单独的文件中,然后在最后重新组合输出。