使用PERL中的LWP :: UserAgent下载XML结果

时间:2011-02-15 03:48:00

标签: xml perl lwp-useragent

我希望在Perl问题上提供一些帮助。

我需要下载一个XML文件,该文件是查询的结果,解析结果,从XML文件中获取下一个链接,下载&重复。

我已经能够下载并解析第一个结果集了。

我抓住了下一个网址,但似乎返回的结果永远不会改变。即:第二次循环,$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";

}

2 个答案:

答案 0 :(得分:0)

我怀疑你得到的文件并不是你所期望的。看起来您正在获取某种搜索页面,然后尝试抓取生成的页面。确保javascript不对您的提取不负责退回您期望的内容,例如other question

此外,您可以尝试转储标题,看看是否可以找到另一条线索:

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

顺便说一句,你应该养成添加“使用警告”的习惯,以防你已经没有。

答案 1 :(得分:0)

服务器可能只提供没有HTTP_REFERER的默认结果。我已经看到一些设置故意这样做以阻止刮擦。

试试这个:

在while循环之前,添加:

my $referer;

就在你之前:

# grab the result of...

加入:

$referer = $url

这样您就可以在将之前的网址重置为下一个网址之前保存它。

然后,在UserAgent标头设置中,将其添加到:

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

我不会肯定这是问题所在,但根据我的经验,这就是我要开始的地方。 另一种选择是在LWP之外尝试。将所有URL记录到一个文件中并尝试将它们或lynx - 从命令行中输出来查看它们是否得到与LWP给出的不同的结果。如果没有,它肯定是服务器正在做的事情,而诀窍是找到解决它的方法,就是......而且这个技巧的解决方案只是为了更复杂地复制常规Web浏览器的功能(因此,比较您的标题发送到Firebug在Firefox中发送的标题或Safari中的Inspector可以帮助很多)