在Mechanize上,可以创建一个用于模拟Web浏览器的用户代理
$agent = WWW::Mechanize->new();
要使用用户代理访问新网页,请执行以下操作:
$agent->get("http://some_url.com");
如果我在浏览器中输入相同的网址,则会重定向到以下内容:
http://some_url.com?param1=value1¶m2=value2
如何检索这些查询参数的值?
答案 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)
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&ei=3KoEWP78GYPj8weZlLXoDA">here</A>.
</BODY></HTML> '
}, 'HTTP::Response' );
如您所见,最终位置可在location
标题中找到。