2010-07-06 64 views
4

我刚刚制作了一个脚本来抓取网站上的链接,并将它们保存到一个文本文件中。如何使用Perl从网站下载链接目标?

现在我的工作在我的正则表达式,因此会抓住它包含php?dl=在URL从文本文件链接:

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

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

我只是想知道如何实现这一点,不得不下载给定的地址,将下载一个*.txt文件的内容。全部来自剧本。

+0

什么是这里的问题?你做了一个脚本,现在只想下载某些URL?你在寻找一个正则表达式吗? – Konerak 2010-07-06 11:39:21

+0

我想弄清楚如何下载与url相关的文件。 例如,在网站上点击'dl'图标/按钮,浏览器会自动为您下载文件。 ie:http://www.example.com/site/admin/a_files.php?dl=33931将下载“file1.txt” 我只是想知道如何以Perl下载文件。正则表达式部分不是问题。 还是我错过了一个可以轻松完成这一切的功能haha – eraldcoil 2010-07-06 11:44:55

回答

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(); 
} 
+0

太棒了!你说过我一直在寻找的所有东西,过去2个小时大声笑。谢谢:D – eraldcoil 2010-07-06 11:58:39

+0

这帮助了很多。非常感谢:D。我还有很多东西需要学习,thnx指出这个非常有用的模块:D – eraldcoil 2010-07-06 12:27:40

+0

在这个例子中,我没有看到使用 - > back()和 - > reload()的理由。 – 2010-07-06 16:14:48

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 $!; 
+0

ahhh ic,这就是你如何使用它。感谢:D – eraldcoil 2010-07-06 12:04:59

+2

或者,只需使用'LWP :: Simple :: getstore($ url,$ file)'。 – 2010-07-06 12:37:35

0

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

例如:

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