WWW :: Mechanize:如何获取重定向URL的查询参数的值

时间:2016-10-17 10:30:34

标签: perl mechanize

在Mechanize上,可以创建一个用于模拟Web浏览器的用户代理

$agent = WWW::Mechanize->new();

要使用用户代理访问新网页,请执行以下操作:

$agent->get("http://some_url.com");

如果我在浏览器中输入相同的网址,则会重定向到以下内容:

http://some_url.com?param1=value1&param2=value2

如何检索这些查询参数的值?

2 个答案:

答案 0 :(得分:1)

您的[WWW :: Mechanize] [机械]会自动跟随重定向。因此,当您呼叫get时,它将处于已经获得带有参数的页面的状态。

由于这些是URL参数,我们可以查看Mech获得的URL。 https://jqueryvalidation.org/remote-method/会返回a uri method个对象,其中包含URI

但首先,为了测试这个,我使用a query_form method来创建一个简单的Web服务器。它侦听端口3000并将请求重定向到//foo?p1=bar&p2=baz

$ perl -MDancer2 -e 'get "/" => sub { redirect "/foo?p1=bar&p2=baz" }; get "/foo" => sub { "hi" }; dance;'
>> Dancer2 v0.166001 server 10889 listening on http://0.0.0.0:3000

现在我们可以对此进行编码。

use strict;
use warnings;
use WWW::Mechanize;
use Data::Dumper;

my $mech = WWW::Mechanize->new;
$mech->get('http://localhost:3000');

my %params = $mech->uri->query_form;
print Dumper \%params;

query_form在列表上下文中调用时返回键/值对。我们可以将它们分配给哈希以获得访问它们的便捷方式。

$VAR1 = {
          'p1' => 'bar',
          'p2' => 'baz'
        };

如果您知道参数出现多次,则应使用数组。

答案 1 :(得分:1)

WWW::Mechanize

get方法返回HTTP::Response个对象。您可以在其上运行redirects方法以获取完整的重定向链。例如,我在google.com的代码下面运行。

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;
use Data::Dumper;

my $agent = WWW::Mechanize->new();

my $object = $agent->get('http://www.google.com/');

print Dumper $object->redirects;

输出:

$VAR1 = bless( {
                 '_msg' => 'Found',
                 '_request' => bless( {
                                        '_headers' => bless( {
                                                               'accept-encoding' => 'gzip',
                                                               'user-agent' => 'WWW-Mechanize/1.82'
                                                             }, 'HTTP::Headers' ),
                                        '_uri_canonical' => bless( do{\(my $o = 'http://www.google.com/')}, 'URI::http' ),
                                        '_uri' => $VAR1->{'_request'}{'_uri_canonical'},
                                        '_content' => '',
                                        '_method' => 'GET'
                                      }, 'HTTP::Request' ),
                 '_protocol' => 'HTTP/1.1',
                 '_rc' => '302',
                 '_headers' => bless( {
                                        'title' => '302 Moved',
                                        'content-length' => '261',
                                        'location' => 'http://www.google.co.in/?gfe_rd=cr&ei=3KoEWP78GYPj8weZlLXoDA',
                                        'date' => 'Mon, 17 Oct 2016 10:41:32 GMT',
                                        'accept-ranges' => 'none',
                                        'cache-control' => 'private',
                                        'client-date' => 'Mon, 17 Oct 2016 10:41:32 GMT',
                                        'connection' => 'close',
                                        'client-response-num' => 1,
                                        'content-type' => 'text/html; charset=UTF-8',
                                        '::std_case' => {
                                                          'title' => 'Title',
                                                          'set-cookie2' => 'Set-Cookie2',
                                                          'client-peer' => 'Client-Peer',
                                                          'client-date' => 'Client-Date',
                                                          'set-cookie' => 'Set-Cookie',
                                                          'base' => 'Base',

                                                          'content-base' => 'Content-Base',
                                                          'client-response-num' => 'Client-Response-Num'
                                                        }
                                      }, 'HTTP::Headers' ),
                 '_content' => '<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.in/?gfe_rd=cr&amp;ei=3KoEWP78GYPj8weZlLXoDA">here</A>.
</BODY></HTML>   '

               }, 'HTTP::Response' );

如您所见,最终位置可在location标题中找到。