【问题标题】:How to obtain the 301/302 website redirect location from the http response and follow it?如何从http响应中获取301/302网站重定向位置并关注?
【发布时间】:2012-08-18 04:53:04
【问题描述】:

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

谁能帮忙从使用 301 或 302 重定向的网站的 http 响应中提取重定向位置?

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

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

【问题讨论】:

    标签: perl redirect mechanize lwp-useragent


    【解决方案1】:

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

    注意-

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

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

    如果您想绝对确定程序正在重定向您的 URL 并将每个重定向记录在日志文件(或其他内容)中,您可以使用 LWPsimple_requestHTTP::Responseis_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 响应代码。

    【讨论】:

    • 是的,我尝试过使用redirect_ok。它似乎没有用。我认为此 redirect_ok 应该自动将我带到重定向站点是否正确?从那时起,我应该能够执行 mech->content 并从重定向站点查看页面内容?如果可能的话,一个代码示例将非常有用,因此我可以检查我是否正确使用它,非常感谢
    • 你能把这段代码贴在这里以便我们更好地提供帮助吗?
    • 目前在 iPad 上工作,所以目前还没有,但我希望实现的目标如下
    • 目前在 iPad 上工作,所以目前还没有,但我希望实现的是一个具有 301/302 重定向的站点如下。使用机械化; www::机械化->新的;如果 r->code = 301{ response->header->('Location');按照重定向位置 URL;打印 $mech-> 内容; .像这样的东西。如果您可以向我展示执行此操作的代码,那就太好了,因为我无法让它工作。非常感谢
    • 根据您的要求更新了答案@user1617711
    【解决方案2】:

    WWW::Mechanize 应该自动跟随重定向(除非你告诉它不要通过 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-&gt;content 正在返回页面内容。这有帮助吗?

    【讨论】:

    • 我认为它确实会自动跟随重定向。但是在具有 301 或 302 重定向的网站上,当我执行 $print mech->content 之后,它没有打印出任何内容。
    • 具有 301/302 重定向的示例网站是 jjbsports.com,您能否告诉我您将如何遵循重定向,然后从您被重定向的页面打印内容。非常感谢您的帮助,谢谢
    • 根据要求使用 jjbsports.com 更新了第二个示例的答案。 (以防您不熟悉 perl 调试器,“x”是转储其参数的简短命令。在普通脚本中,您可以改为使用例如 print $mech-&gt;content。)
    • 非常感谢。我知道 perl 调试器,但以前从未使用过它。不过会更多地研究它,因为它显然非常有用。如果我能做到,会通知你。
    • 这当然是一个有用的工具——perldoc perldebtut 会给你一些入门帮助。您还可以查看 Eval::WithLexicals 提供的 Devel::REPL 或 tinyrepl
    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2016-09-30
    • 2011-12-05
    • 1970-01-01
    • 2014-08-18
    • 2016-06-21
    • 2018-07-15
    相关资源
    最近更新 更多