2

我一直在尝试使用perl Mechanize ( WWW::Mechanize ) 从 http 响应中获取 301/302 重定向位置,但是在使用 response->header 等从响应中提取它时遇到了问题。

任何人都可以帮助从使用 301 或 302 重定向的网站的 http 响应中提取重定向位置吗?

一旦我有了这个重定向位置 URL,我就知道我想做什么以及如何做,因为我之前用 Mechanize 做过更复杂的事情,但我只是在获取位置(或任何其他响应字段)时遇到了真正的问题http响应。

非常感谢您的帮助,非常感谢,CM

4

2 回答 2

5

WWW::Mechanize应该自动跟随重定向(除非你告诉它不要 via requests_redirectable),所以你不需要做任何事情。

编辑:只是为了证明:

DB<4> $mech = WWW::Mechanize->new;

DB<5> $mech->get('http://www.preshweb.co.uk/linkedin');

DB<6> x $mech->uri;
0  URI::http=SCALAR(0x903f990)
  -> 'http://www.linkedin.com/in/bigpresh'

...如您所见,WWW::Mechanize 跟随重定向,并自动到达目的地。

根据要求更新了另一个示例:

DB<15> $mech = WWW::Mechanize->new;

DB<16> $mech->get('http://jjbsports.com/');

DB<17> x $mech->uri;
0  URI::http=SCALAR(0x90988f0)
 -> 'http://www.jjbsports.com/'
DB<18> x substr $mech->content, 0, 40;
0  '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML'
DB<19> x $mech->title;
0  'JJB Sports | Trainers, Clothing, Football Kits, Football Boots, Running'

如您所见,它遵循重定向,并$mech->content返回页面内容。这些帮助有用?

于 2012-08-22T18:13:29.207 回答
1

如果它是重定向,WWW::Mechanize将使用$mech->redirect_ok();whilerequest()跟踪重定向 URL(这是一种 LWP 方法)。

笔记 -

WWW::Mechanize 的构造函数推POST送到代理的 requests_redirectable 列表

因此,您不必担心推POST送到requests_redirectable列表。

如果您想绝对确定程序正在重定向您的 URL 并将每个重定向记录在日志文件(或其他内容)中,您可以使用LWP'ssimple_requestHTTP::Response'sis_redirect来检测重定向,如下所示 -

use WWW::Mechanize; 

$mech = WWW::Mechanize->new();  
$mech->stack_depth(0);

my $resp = $mech->simple_request( HTTP::Request->new(GET => 'http://www.googl.com/') );
if( $resp->is_redirect ) {
  my $location = $resp->header( "Location" );
  my $uri = new URI( $location );
  print "Got redirected to URL - $uri\n";    
  $mech->get($uri);
  print $mech->content;
}

is_redirect将检测 301 和 302 响应代码。

于 2012-08-22T18:05:53.897 回答