Perl WWW::Mechanize(或 LWP)获取重定向 url

Posted

技术标签:

【中文标题】Perl WWW::Mechanize(或 LWP)获取重定向 url【英文标题】:Perl WWW::Mechanize (or LWP) get redirect url 【发布时间】:2012-06-10 22:21:23 【问题描述】:

所以我使用WWW::Mechanize 来抓取网站。它工作得很好,除非我请求一个网址,例如:

http://www.levi.com/

我被重定向到:

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

对于我的脚本,我需要知道这个重定向发生了,以及我被重定向到的 url 是什么。有没有办法用WWW::MechanizeLWP 检测到这个,然后得到重定向的url?谢谢!

【问题讨论】:

【参考方案1】:

您也可以通过检查响应对象上的redirects() 方法到达相同的位置。

use strict;
use warnings;
use feature qw( say );

use WWW::Mechanize;

my $ua = WWW::Mechanize->new;
my $res = $ua->get('http://metacpan.org');

my @redirects = $res->redirects;
say 'request uri: ' . $redirects[-1]->request->uri;
say 'location header: ' . $redirects[-1]->header('Location');

打印:

request uri: http://metacpan.org
location header: https://metacpan.org/

参见https://metacpan.org/pod/HTTP::Response#$r-%3Eredirects 请记住,可能不止一个重定向会将您带到您当前的位置。因此,您可能需要检查通过 redirects() 返回的每个响应。

【讨论】:

【参考方案2】:
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的响应头。

【讨论】:

如果我想再次允许重定向,或者像重置重定向计数,有没有办法可以做到这一点?或者例如,我是否可以按照一串重定向到他们的最终位置并且仍然知道状态在 300 到 400 之间?我摆脱了 max_redirect(0),但后来我得到了 500 的状态,我知道这是不对的...... 如果有人将其作为参考,只需在 $mech 中存储一个新的 WWW::Mechanize 对象即可。

以上是关于Perl WWW::Mechanize(或 LWP)获取重定向 url的主要内容,如果未能解决你的问题,请参考以下文章

Perl 与 Parallel::ForkManager 和 WWW::Mechanize 一起崩溃

是否有与 Perl 的 WWW::Mechanize 等效的 PHP?

为啥当我使用 Perl 的 REST::Client 发送 POST 请求,而不是使用 Perl 的 LWP::UserAgent 或 Python 时,我得到“405: Method Not All

在 Perl 中使用 LWP 登录网站

(perl) 终端 (Mac) 如何在 @INC 中找到 LWP...?

提高 LWP::Simple perl 性能