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

标签 multithreading perl wget

我需要使用 wget 通过从文本文件中读取 url 并行使用 wget 下载大量(例如 1000 个)递归级别 1 的小页面。网页类似,只有一个嵌入对象。例如,我需要并行获取 100 个页面,以便该过程只需 10 个步骤即可完成。 我不确定是否继续使用 Perl 中的线程或使用某些 wget 选项来执行此操作。 有人可以帮我提供一个代码片段来执行此操作吗?

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

  1. 创建 100 个线程并同时运行它们。
  2. 我将 count 作为参数传递给子例程
  3. 根据 count 的值,对从 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);
}

最佳答案

正如您所说“通过从文本文件中读取网址”。 您可以通过读取每一行并将其打印到 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

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

cat urls.txt | xargs -n 1 -P 5 wget

或者

cat urls.txt | parallel -j 5 wget

希望这能解决您的问题。

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

关于multithreading - 通过 perl 脚本使用 wget 读取 URL 列表来并行下载网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25057299/

相关文章:

ios - 退出应用程序时停止执行进程

perl - 在 Perl 中,如何检查文件是否被锁定?

linux - 非交互式命令行工具是什么意思?

java - 在java中读取shell脚本输出(wget)

c# - 如何在单独的线程中执行自定义类的方法调用?

python - 我如何在 python 中进行线程化?

python - Python:上传图片而不会干扰程序的正常流程

java - 惰性(贪婪)使用正则表达式匹配多个组

regex - 如何从文件中 grep 精确匹配特殊字符?

unix - Solr DataImportHandler 清算索引