Загрузка результатов XML с помощью LWP :: UserAgent в PERL - PullRequest
2 голосов
/ 15 февраля 2011

Я надеюсь на некоторую помощь с проблемой Perl.

Мне нужно загрузить файл XML, являющийся результатом запроса, проанализировать результаты, получить следующую ссылку из файла XML, загрузить и повторить.

Мне удалось загрузитьи разобрать первый набор результатов в порядке.

Я беру следующий URL, но кажется, что возвращаемый результат никогда не меняется.То есть: второй раз в цикле, $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 голосов
/ 15 февраля 2011

Сервер может давать вам только результаты по умолчанию без HTTP_REFERER.Я видел, как некоторые установки делают это намеренно, чтобы не допустить очистки.

Попробуйте это:

Перед циклом while добавьте:

my $referer;

Прямо перед тем, как вы получите:

# grab the result of...

Добавить:

$referer = $url

Таким образом, вы сохраняете предыдущий URL-адрес перед его сбросом на следующий.

Затем в настройках заголовка UserAgent,добавьте это в:

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

Я не скажу наверняка, что это проблема, но по моему опыту именно с этого я и начну.Другой вариант - попробовать за пределами LWP.Запишите все ваши URL в файл и попробуйте wget-ting их или lynx -source-ing их из командной строки, чтобы увидеть, если вы получите результаты, отличные от LWP.Если нет, то, безусловно, что-то делает сервер, и хитрость заключается в том, чтобы найти способ обойти его, вот и все ... и решение этой хитрости заключается в том, чтобы просто более точно продублировать то, что делает обычный веб-браузер (таким образом, сравниваяВаши заголовки, отправленные на заголовки, отправленные Firebug в Firefox или Инспектором в Safari, могут сильно помочь)

0 голосов
/ 15 февраля 2011

Я подозреваю, что документ, который вы получаете, не тот, который вы ожидаете.Похоже, вы выбираете какую-то страницу поиска, а затем пытаетесь сканировать получившиеся страницы.Убедитесь, что javascript не несет ответственности за то, что ваша загрузка не вернула ожидаемое вами содержимое, как в этом другом вопросе .

Также вы можете попробовать сбросить заголовки, чтобы увидеть, можете ли вы найти другой.подсказка:

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

Кроме того, вы, вероятно, должны иметь привычку добавлять «предупреждения об использовании», если вы этого еще не сделали.

...