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

时间:2014-07-31 11:03:51

标签: multithreading perl wget

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

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

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

    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);
    }
    

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我可能会使用Parallel::ForkManager而不是线程WWW::Mechanize而不是curl / wget。

快速搜索CPAN也会出现LWP::Parallel