2011-02-15 82 views
2

我希望得到Perl問題的一些幫助。在PERL中使用LWP :: UserAgent下載XML結果

我需要下載一個查詢結果的XML文件,解析結果,從XML文件中抓取下一個鏈接,重複下載&。

我已經能夠下載和分析的第一個結果集的罰款。

我抓住下一個URL,但似乎返回的結果不會改變。 I.e .:通過循環第二次,$res->content與第一次相同。因此,$url的值在第一次下載後永遠不會改變。

我懷疑這是一個範圍問題,但我似乎無法得到這個句柄。

use LWP::UserAgent; 
use HTTP::Cookies; 
use Data::Dumper; 
use XML::LibXML; 
use strict; 

my $url = "http://quod.lib.umich.edu/cgi/f/findaid/findaid-idx?c=bhlead&cc=bhlead&type=simple&rgn=Entire+Finding+Aid&q1=civil+war&Submit=Search;debug=xml"; 

while ($url ne ""){ 

    my $ua = LWP::UserAgent->new();  
    $ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'); 
    $ua->timeout(30); 
    $ua->default_header('pragma' => "no-cache", 'max-age' => '0'); 

    print "Download URL:\n$url\n\n"; 

    my $res = $ua->get($url); 

    if ($res->is_error) { 
     print STDERR __LINE__, " Error: ", $res->status_line, " ", $res; 
     exit; 
    } 

    my $parser = XML::LibXML->new(); 
    my $doc = $parser->load_xml(string=>$res->content); 

    #grab the url of the next result set 
    $url = $doc->findvalue('//ResultsLinks/SliceNavigationLinks/NextHitsLink'); 

    print "NEXT URL:\n$url\n\n"; 

} 
+0

你從`print`行得到什麼輸出? – cjm 2011-02-15 06:22:48

+0

下載網址: http://quod.lib.umich.edu/cgi/f/findaid/findaid-idx?c = bhlead&cc = bhlead&type = simple&rgn = Entire + Finding + Aid&q1 = civil + war&Submit = Search; debug = xml 下載地址: http://quod.lib.umich.edu/cgi/f/findaid/findaid-idx? c = bhlead; cc = bhlead; type = simple; rgn = Entire%20Finding%20Aid; q1 = civil%20war; debug = xml; view = reslist; subview = short; sort = occur; start = 26; size = 25 NEXT URL: http://quod.lib.umich.edu/cgi/f/findaid/findaid-idx?c=bhlead;cc=bhlead;type=simple;rgn=Entire%20Finding%20Aid;q1=civil %20war; debug = xml; view = reslist; subview = short; sort = occur; start = 26; size = 25 – Matt 2011-02-15 14:17:49

回答

0

我懷疑你得到的文檔不是你所期望的。看起來您正在獲取某種搜索頁面,然後嘗試抓取生成的頁面。確保javascript不負責您的抓取不會返回您期望的內容,如other question

另外,你可以嘗試傾銷頭,看看是否能找到另一條線索:

use Data::Dumper; 
print Dumper($res->headers), "\n"; 

順便說一句,你應該得到的習慣的情況下,增加「使用警告」你已經避風港「T。

0

服務器可以給你只能默認結果沒有HTTP_REFERER。我已經看到一些設置故意阻止刮擦。

試試這個:

while循環之前,加入:

my $referer; 

右鍵你面前:

# grab the result of... 

添加在:

$referer = $url 

這樣在resetti之前保存以前的URL把它交給下一個。

然後,在你的UserAgent頭設置,添加在:

$ua->default_header(pragma => "no-cache", max-age => 0, Referer => $referer); 

我不會肯定地說,這是問題,但在我的經驗,這就是我想要開始。 另一種選擇是在LWP之外嘗試。將所有URL記錄到一個文件中,並嘗試使用wget-ting它們或lynx - 從命令行輸入它們來查看是否得到與LWP不同的結果。如果不是的話,那肯定是服務器在做什麼,訣竅是找到一種方法來解決它,都是......而解決方法就是更密切地複製常規Web瀏覽器的功能(因此,比較你的頭被髮送到Firefox中的Firebug或Safari中的Inspector發送的頭文件可以幫助很多)

相關問題