2012-06-06 4 views
8

Так что я использую WWW::Mechanize для обхода сайтов. Он отлично работает, за исключением, если запросить URL, такие как:Perl WWW :: Mechanize (или LWP) получить URL-адрес перенаправления

http://www.levi.com/ 

Я перенаправлены:

http://us.levi.com/home/index.jsp 

И мой сценарий мне нужно знать, что это редирект имела место и что URL я был перенаправлен на is. Есть ли все-таки, чтобы обнаружить это с WWW::Mechanize или LWP, а затем получить перенаправленный URL? Благодаря!

ответ

9
use strict; 
use warnings; 
use URI; 
use WWW::Mechanize; 

my $url = 'http://...'; 
my $mech = WWW::Mechanize->new(autocheck => 0); 
$mech->max_redirect(0); 
$mech->get($url); 

my $status = $mech->status(); 
if (($status >= 300) && ($status < 400)) { 
    my $location = $mech->response()->header('Location'); 
    if (defined $location) { 
    print "Redirected to $location\n"; 
    $mech->get(URI->new_abs($location, $mech->base())); 
    } 
} 

Если код состояния 3XX, то вы должны проверить заголовки ответа для перенаправления URL.

+1

wow! Отлично. Большое спасибо :) – srchulo

+0

Если бы я хотел снова разрешить перенаправления или как сбросить счет переадресации, можно ли мне это сделать? Или, например, можно ли следовать цепочке перенаправлений в их окончательное местоположение и все еще знать, что статус был от 300 до 400? Я избавился от max_redirect (0), но потом я получил статус 500, и я знаю, что это неправильно ... – srchulo

+0

Если кто-то смотрит на это для справки, простое хранение нового объекта WWW :: Mechanize в $ mech делает трюк. – srchulo

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