我希望在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";
}
答案 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可以帮助很多)