2

Perlの問題についての支援を期待しています。

クエリの結果であるXMLファイルをダウンロードし、結果を解析し、XMLファイルから次のリンクを取得して、ダウンロードして繰り返す必要があります。

最初の結果セットを正常にダウンロードして解析することができました。

次のURLを取得しましたが、返される結果は変わらないようです。つまり、ループの2回目$res->contentは、1回目と同じです。したがって、の値は$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";

}
4

2 に答える 2

0

I suspect the doc you're getting isn't what you expect. It looks like you're fetching a some kind of search page and then trying to crawl the resulting pages. Make sure javascript isn't responsible for your fetch not returning the content you expect, as in this other question.

Also, you might try dumping the headers to see if you can find another clue:

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

As an aside, you should probably get in the habit of adding "use warnings" in case you already haven't.

于 2011-02-15T06:41:59.007 に答える
0

サーバーは、HTTP_REFERER なしでデフォルトの結果のみを提供している可能性があります。スクレイピングを思いとどまらせるために、意図的にこれを行うセットアップを見てきました。

これを試して:

while ループの前に、以下を追加します。

my $referer;

あなたが持っている直前:

# grab the result of...

加える:

$referer = $url

そうすれば、次の URL にリセットする前に以前の URL を保存できます。

次に、UserAgent ヘッダー設定で、次のように追加します。

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

これが問題だとは断言できませんが、私の経験では、そこから始めます。もう 1 つのオプションは、LWP の外で試すことです。すべての URL をファイルに記録し、コマンド ラインから wget-ting または lynx --source-ing を試して、LWP とは異なる結果が得られるかどうかを確認してください。そうでない場合、それは確かにサーバーが行っていることであり、トリックはそれを回避する方法を見つけることです...そしてトリックの解決策は、通常のWebブラウザーが行うことをより厳密に複製することです(したがって、 Firefox の Firebug または Safari のインスペクターによって送信されたヘッダーに送信されたヘッダーは大いに役立ちます)

于 2011-02-15T20:46:51.217 に答える