如何使用Perl从网站下载链接目标?

时间:2010-07-06 11:34:48

标签: perl download www-mechanize

我刚刚创建了一个脚本来从网站上获取链接,然后将它们保存到文本文件中。

现在我正在处理我的正则表达式,因此它将从文本文件中获取包含php?dl=的链接:

例如:www.example.com/site/admin/a_files.php?dl=33931

当您将鼠标悬停在网站上的dl按钮上时,它几乎就是您的地址。您可以从中单击下载或“右键单击保存”。

我只想知道如何实现这一目标,必须下载将下载*.txt文件的给定地址的内容。所有这些都来自剧本。

4 个答案:

答案 0 :(得分:7)

WWW::Mechanize成为你最好的朋友。

原因如下:

  • 它可以识别网页上与特定正则表达式相匹配的链接(在这种情况下为/php\?dl=/
  • 可以通过follow_link方法
  • 关注这些链接
  • 它可以get这些链接的目标并将其保存到文件

所有这些都无需在中间文件中保存您想要的链接!当你拥有适合工作的正确工具时,生活会很甜蜜......


示例

use strict;
use warnings;
use WWW::Mechanize;

my $url  = 'http://www.example.com/';
my $mech = WWW::Mechanize->new();

$mech->get ( $url );

my @linksOfInterest = $mech->find_all_links ( text_regex => qr/php\?dl=/ );

my $fileNumber++;

foreach my $link (@linksOfInterest) {

    $mech->get ( $link, ':contentfile' => "file".($fileNumber++).".txt" );
    $mech->back();
}

答案 1 :(得分:3)

答案 2 :(得分:3)

您可以使用LWP::UserAgent下载文件:

my $ua = LWP::UserAgent->new();  
my $response = $ua->get($url, ':content_file' => 'file.txt');  

或者如果您需要文件句柄:

open my $fh, '<', $response->content_ref or die $!;

答案 3 :(得分:0)

老问题,但是当我做快速脚本时,我经常使用“wget”或“curl”和pipe。这可能不是跨系统的可移植的,但如果我知道我的系统有这些命令中的一个或另一个,那么它通常是好的。

例如:

#! /usr/bin/env perl
use strict;
open my $fp, "curl http://www.example.com/ |";
while (<$fp>) {
  print;
}