2010-07-06 49 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; 
} 
相關問題