2011-02-15 85 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发送的头文件可以帮助很多)

相关问题