0

我正在開發一個項目到網站,將每次採訪發現here轉化爲一個HTML準備好的文檔,稍後轉儲到一個DB中,該DB將自動更新我們的網站最新的內容。你可以看到我當前的網站抓取腳本的一個例子,我問了一個有關前一天的問題:WWW::Mechanize Extraction Help - PERL使用WWW :: Mechanize刮目錄下的多個頁面 - Perl

問題我似乎無法環繞我的頭是知道如果我現在想要完成的是甚至可能。因爲我不想猜想當一個新的採訪發佈時,我希望能夠抓取具有所有采訪目錄列表的網站,並自動讓我的程序獲取新的內容網址(新面試)。

再次,有問題的網站是在這裏(向下滾動查看面試上市):在上面的鏈接的結束,希望http://millercenter.org/president/clinton/oralhistory

我最初的想法是有一個正則表達式\它會自動搜索在該頁面下找到的任何鏈接。但是,我似乎無法使用WWW :: Mechanize獲得此功能。我將發佈我在下面的內容,如果任何人有任何指導或經驗與此,您的反饋將不勝感激。我還會在代碼下面總結我的任務,以便您對我們希望完成的任務有一個簡明的理解。

感謝任何和所有可以幫助!

#!/usr/bin/perl -w 

use strict; 
use WWW::Mechanize; 
use WWW::Mechanize::Link; 
use WWW::Mechanize::TreeBuilder; 

my $mech = WWW::Mechanize->new(); 
WWW::Mechanize::TreeBuilder->meta->apply($mech); 
$mech->get("http://millercenter.org/president/clinton/oralhistory/\."); 

# find all <dl> tags 
my @list = $mech->find('dl'); 

foreach (@list) { 
print $_->as_HTML(); 
} 

# # find all links 
# my @links = $mech->links(); 
# foreach my $link (@links) { 
#  print "$link->url \n"; 
# } 

要總結一下我希望是可能的:

  • 提取每一次採訪的內容的HTML準備文檔中找到here像我一樣在這裏:WWW::Mechanize Extraction Help - PERL。這需要'get'操作能夠遍歷/ oralhistory /目錄下列出的頁面,這些頁面可以使用正則表達式來解決?

  • 可能解壓目錄頁答辯名稱和位置字段標題字段中填充(這不是什麼大不了的事,如果它不能這樣做)

+0

你的線條與''//破壞你的代碼。 Perl的註釋僅適用於您已經使用過的'#'。 – simbabque

+0

哎呀!我手動添加了這些,這是我的錯誤。我在腳本中有#,所以它沒有任何問題在運行。謝謝你指出,雖然。我會編輯它。 – MikeEMKI

回答

1

無,您不能在網址上使用通配符.. :-(

您必須使用列表解析頁面,然後在循環中獲取並處理頁面。 要從頁面內容中提取特定字段將與WWW ::機械化一個偉大的任務...

UPDATE:回答OP評論:

試試這個邏輯:

use strict; 
use warnings; 
use WWW::Mechanize; 
use LWP::Simple; 
use File::Basename; 

my $mech = WWW::Mechanize->new(autocheck => 1); 
$mech->get("http://millercenter.org/president/clinton/oralhistoryml"); 

# find all <dl> tags 
my @list = $mech->find('dl'); 

foreach my $link (@list) { 
    my $url  = $link->url(); 
    my $localfile = basename($url); 
    my $localpath = "./$localfile"; 

    print "$localfile\n"; 
    getstore($url, $localpath); 
} 
+0

嗯..我有點困惑。你是說我可以解析目錄頁面,然後創建一個循環讓'get'能夠讀取該頁面上的鏈接?如果是這樣,你有這樣的例子嗎?如果我誤解了你的回覆,請告訴我! – MikeEMKI

0

我的答案是專注於如何做到這一點的方法我不提供代碼

鏈接中沒有ID,但採訪頁面的名稱似乎很好用。你需要解析出來並建立一個查找表。

基本上,你通過構建一個解析器來獲取所有看起來像面試的鏈接。WWW :: Mechanize相當簡單。該頁面的網址是:

http://millercenter.org/president/clinton/oralhistory

所有采訪遵循這個模式:

http://millercenter.org/president/clinton/oralhistory/george-mitchell

所以,你可以在該頁面與啓動所有鏈接http://millercenter.org/president/clinton/oralhistory/。然後你讓它們變得獨一無二,因爲有這個傳情箱滑塊的東西展示了其中的一些,並且它有一個閱讀更多鏈接到頁面。使用哈希來做這樣的事情:

my %seen; 
foreach my $url (@urls) { 
    $mech->get($url) unless $seen{$url}; 
    $seen{$url}++; 
} 

然後你抓取頁面,做你的東西,並把它寫入你的數據庫。使用URL的URL或訪問名稱部分(例如goerge-mitchell)作爲主鍵。如果還有其他總統,並且您也想要這些,請在幾位總統同名的情況下進行調整。

然後你回去並在你的代碼中添加一個緩存查找。在開始獲取頁面之前,您從數據庫中獲取所有ID,並將其放入哈希中。

# prepare query and stuff... 
my %cache; 
while (my $res = $sth->fetchrow_hashref) { 
$cache{$res->{id}}++; 
} 

# later... 
foreach my $url (@urls) { 
    next if $cache{$url}; # or grab the ID out of the url 
    next if $seen{$url}; 

    $mech->get($url); 
    $seen{$url}++; 
} 

您還需要篩選出不是面試的鏈接。其中之一是http://millercenter.org/president/clinton/oralhistory/clinton-description,這是閱讀頁面上的第一款多

+0

至於從頁面提取數據,這是一個不同的問題。一旦你到達那裏,你應該單獨詢問。 – simbabque

相關問題