2010-03-18 1 views
5

Я делаю около web scraping с использованием LWP в Perl. Мне нужно обработать набор URL-адресов, некоторые из которых могут перенаправлять (1 или более раз).Как я могу получить конечный URL-адрес, не загружая страницы с помощью Perl и LWP?

Как я могу получить конечный URL-адрес со всеми разрешенными переадресациями, используя метод HEAD?

+0

Это является контратип http://stackoverflow.com/questions/2010366/how-can- i-find-the-final-url-after-all-redirections-in-perl – Ether

ответ

8

Как указано в perldoc LWP::UserAgent, по умолчанию будет следовать переадресации для GET и HEAD запросов:

$ua = LWP::UserAgent->new(%options) 

... 
     KEY      DEFAULT 
     -----------    -------------------- 
     max_redirect   7 
     ... 
     requests_redirectable ['GET', 'HEAD'] 

Вот пример:

#!/usr/bin/perl 

use strict; use warnings; 
use LWP::UserAgent; 

my $ua = LWP::UserAgent->new(); 
$ua->show_progress(1); 

my $response = $ua->head('http://unur.com/'); 

if ($response->is_success) { 
    print $response->request->uri->as_string, "\n"; 
} 

Выход:

** HEAD http://unur.com/ ==> 301 Moved Permanently (1s) 
** HEAD http://www.unur.com/ ==> 200 OK 
http://www.unur.com/
+0

Абсолютно корректно, но я думаю, что OP хотел знать, что на самом деле были URL-адреса, когда-то все переадресации выполнялись. –

+0

@ Тони Спасибо, что подняли головы. Я не заметил этого сразу и разместил образец сценария, по-видимому, после вашего ответа. –

+0

Oooh, я не видел метод uri-> as_string, который показывает всю последовательность. Очень хорошо. –

11

Если вы используете полнофункциональную версию LWP::UserAgent, то ответ, который возвращается, представляет собой экземпляр HTTP::Response, который, в свою очередь, имеет атрибут HTTP::Request. Обратите внимание, что это NOT обязательно тот же HTTP :: Запрос, который вы создали с исходным URL-адресом в своем наборе URL-адресов, как описано в документации HTTP :: Response для способа получения экземпляра запроса в экземпляре ответа:

$ r-> запрос ($ запрос)

Это используется, чтобы получить/установить атрибут запроса. Атрибут request - это ссылка на запрос, вызвавший этот ответ. Это не обязательно должен быть тот же запрос, переданный методу $ ua-> request(), потому что между ними могут быть повторные перенаправления и авторизации.

Как только у вас есть объект запроса, вы можете использовать метод uri для получения URI. Если были использованы перенаправления, URI является результатом следования цепочке перенаправления.

Вот скрипт Perl, испытано и проверено, что дает скелет, что вам нужно:

#!/usr/bin/perl 

use strict; 
use warnings; 

use LWP::UserAgent; 

my $ua; # Instance of LWP::UserAgent 
my $req; # Instance of (original) request 
my $res; # Instance of HTTP::Response returned via request method 

$ua = LWP::UserAgent->new; 
$ua->agent("$0/0.1 " . $ua->agent); 

$req = HTTP::Request->new(HEAD => 'http://www.ecu.edu/wllc'); 
$req->header('Accept' => 'text/html'); 

$res = $ua->request($req); 

if ($res->is_success) { 
    # Using double method invocation, prob. want to do testing of 
    # whether res is defined. 
    # This is inline version of 
    # my $finalrequest = $res->request(); 
    # print "Final URL = " . $finalrequest->url() . "\n"; 
    print "Final URI = " . $res->request()->uri() . "\n"; 
} else { 
    print "Error: " . $res->status_line . "\n"; 
} 
+0

Спасибо за подробное объяснение. – planetp

Смежные вопросы