通过 perl 脚本使用 wget 读取 URL 列表并行下载网页

Dco*_*der 2 perl multithreading wget

我需要通过从文本文件中读取 url 使用 perl 并行使用 wget 下载大量(比如 1000 个)递归级别为 1 的小页面。这些网页与只有一个嵌入对象相似。我需要一组 100 页并行提取,以便该过程在 10 个步骤中完成,例如。我不确定是继续使用 Perl 中的线程还是使用一些 wget 选项来这样做。有人可以帮我提供一个代码片段来做到这一点。

我编写了以下例程来执行以下操作。

  1. 创建 100 个线程并同时运行它们。
  2. 我将计数作为参数传递给子程序
  3. 根据计数值,从 page1.html 开始向 page100.html 发送每个网页的 wget 请求。

这样对吗 ?

use Threads;

print "Started at: ", time, "\n";
print "Starting main program\n";

my @threads;
for ( my $count = 1; $count <= 100;$count++) {
    my $t = threads->new(\&sub1,$count);
    push(@threads,$t);
}

foreach (@threads) {
    $_->join;
}

print "End of main program\n";
print "Stopped at: ", time, "\n";

sub sub1 {
    my $count = shift;
    print "Called at: ", time, "\n";
    sleep 2;
    #Send wget requests
    system(wget -r -l 1 http://path/page.$count.\.html);
}
Run Code Online (Sandbox Code Playgroud)

zdk*_*zdk 5

正如您所说的“通过从文本文件中读取网址”。您可以通过阅读每一行并将其打印到 STDOUT 来做到这一点,但我认为在这种情况下您并不真正需要 Perl。

您可以使用wget您想要的选项,例如 -r、-l 并使用 -nv 关闭详细信息,然后写入 urls.txt 文件。例如,要下载http://brew.sh站点,您可以这样做:

wget -nv -r -l 1 http://brew.sh 2>&1 | grep "URL:" | awk '{print $3}'|sed 's/URL://' > urls.txt
Run Code Online (Sandbox Code Playgroud)

您可以简单地使用cat带有 -P 选项的 GNU Findutils (xargs) 或带有 -j 选项的 GNU Parallel 来指定您想要的作业数量。像这样:

cat urls.txt | xargs -n 1 -P 5 wget
Run Code Online (Sandbox Code Playgroud)

或者

cat urls.txt | parallel -j 5 wget
Run Code Online (Sandbox Code Playgroud)

希望这能解决您的问题。

另外,例如:https : //www.gnu.org/software/parallel/man.html#example__breadth_first_parallel_web_crawler_mirrorer