Perl 如何从http响应中获取301/302网站重定向位置并进行跟踪?

Perl 如何从http响应中获取301/302网站重定向位置并进行跟踪?,perl,redirect,mechanize,lwp-useragent,Perl,Redirect,Mechanize,Lwp Useragent,我一直在尝试使用perl Mechanize()从http响应中获取301/302重定向位置,但是在使用response->header等从响应中提取它时遇到了问题 有人可以帮助从使用301或302重定向的网站的http响应中提取重定向位置吗? 我知道一旦我有了这个重定向位置URL,我想做什么以及如何做,因为我以前用Mechanize做过更复杂的事情,但我只是在从http响应获取位置(或任何其他响应字段)方面遇到了实际问题 非常感谢您的帮助,非常感谢,CM如果是重定向,WWW::Mechaniz

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

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

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


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

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

注-

WWW::Mechanize的构造函数将
POST
推送到代理的 请求可重定向列表

这样,您就不必担心将
POST
推送到
可重定向的请求列表

如果您想绝对确定程序正在重定向您的URL并将每个重定向记录在日志文件(或其他文件)中,您可以使用
LWP
simple\u request
HTTP::Response
is\u 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\u redirect
将检测301和302响应代码。

应自动遵循重定向(除非您已告知它不要通过
请求重定向),因此您无需执行任何操作

编辑:仅用于演示:

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'
DB$mech=WWW::Mechanize->new;
DB$mech->get('http://www.preshweb.co.uk/linkedin');
DB x$mech->uri;
0 URI::http=标量(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'
DB$mech=WWW::Mechanize->new;
DB$mech->get('http://jjbsports.com/');
DB x$mech->uri;
0 URI::http=标量(0x90988f0)
-> 'http://www.jjbsports.com/'
DB x substr$mech->content,0,40;

0'是的,我尝试过使用重定向。\u ok。它似乎不起作用。我认为这个重定向应该自动将我带到重定向站点,对吗?从那时起,我应该能够做一个机械->内容和查看页面内容从重定向网站?如果可能的话,一个代码示例将非常有用,这样我可以检查我是否正确使用了它,谢谢。你能在这里发布代码片段以便我们能更好地帮助我们吗?目前正在iPad上工作,所以不是现在,但我希望实现的是如下所示:目前正在iPad上工作,所以不是现在,但是对于一个有301/302重定向的站点,我希望实现如下目标。使用机械化;www::Mechanize->new;如果r->code=301{response->header->('Location');遵循重定向位置URL;print$mech->content;。类似于这样。如果您能向我展示执行此操作的代码,那将是非常好的,因为我无法让它工作。谢谢。根据您的要求更新了答案@user1617711我以为它会自动遵循重定向。但是在一个有301或302 re的网站上direct它在我完成$print mech->content after后没有打印任何内容。有一个301/302重定向的示例站点是jjbsports.com,您能告诉我如何遵循重定向,然后打印重定向页面的内容吗?非常感谢您的帮助,使用jjbsport的第二个示例回答s、 com(以防您不熟悉perl调试器,“x”是一个用于转储其参数的短命令。从普通脚本中,您可以改为说,例如
print$mech->content
)非常感谢。我知道perl调试器,但以前从未使用过。不过,我会进一步研究它,因为它显然非常有用。我会让您知道我是否能做到这一点。它当然是一个有用的工具-
perldoc perldebtut
会给您一些入门帮助。您还可以查看提供的Devel::REPL或
tinyrepl
通过Eval::使用词汇。