- 论坛徽章:
- 2
|
Perl使用技巧19:使用get和post请求数据
最常用的3个模块:
use HTTP::Request::Common; #GET POST
use LWP::Simple; #get getstore mirror
use LWP::UserAgent;
常用的2个Useragent:
$iphone = "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53";
$chrome= "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36";
-----------
大体来说:
LWP::UserAgent是用来组装浏览器信息的。
LWP::Simple是一个简化的模块
HTTP::Request 是用来组装请求信息的。
HTTP::Request::Common是一个简化的模块
HTTP::Headers是用来组装头部信息的。
如果用简化模块的话,这个模块可以不用。
-----------
一般GET的时候最简单,不需要改变头部信息,最简单的方法是这样:
$url="baidu.com";
$get=get($url);
say $get;
注意请替换为http的网址,我发不了连接。
get是LWP::Simple中的方法,一次获得内容。
-----------
$res=$ua->get($url);
$get=$res->content;
say $get;
这样也可以,这个get是ua的方法。
-----------
获取网络请求到文件,这个是LWP::Simple中的方法:
$file="/tmp/get.txt";
getstore($url,$file);
-----------
LWP::UserAgent中关于post的方法是这样的:
$ua->post( $url, \%form )
$ua->post( $url, \@form )
$ua->post( $url, \%form, $field_name => $value, ... )
$ua->post( $url, $field_name => $value,... Content => \%form )
$ua->post( $url, $field_name => $value,... Content => \@form )
$ua->post( $url, $field_name => $value,... Content => $content )
简单的时候还算好用,如果想仔细检查头部信息的话,就不如分步来提交了,方便调试。
-----------
sub mypost {
my ($url,$content,$header)=@_;
my $ua=new LWP::UserAgent;
my $req;
if ($content) {
if ($header) {
$req=POST($url,%$header,Content=>$content);
}else{
$req=POST($url,$content);
}
}else{
$req=GET($url);
}
# say Dumper($req)
my $res=$ua->request($req);
my $get=$res->content;
$get=decode_utf8($get);
return $get;
}
header可以提前准备好:
my %header=(
'Content_Type' => 'multipart/form-data'
);
content也可以提前准备好:
my %content=(
"api_key"=>$FACE_key,
"api_secret"=>$FACE_secret,
"attribute"=>"none"
);
请求的时候,只送上URL就可以get。
送上URL和content就可以post。
如果还需要改header,就再送上头部信息。
my $get=mypost($FACE_base,\%content,\%header);
----------------
say Dumper($req);
类似这个样子:
$VAR1 = bless( {
'_content' => '',
'_uri' => bless( do{\(my $o = 'baidu.com')}, 'URI::http' ),
'_headers' => bless( {}, 'HTTP::Headers' ),
'_method' => 'GET'
}, 'HTTP::Request' );
对于需要设置头部的网络请求,最好是Dumper出来看看对不对,否则设置错误是不会请求成功的。
---------------
如果需要设置浏览器信息头,类似这个样子:
sub myget {
my ($url,$proxy,$mobile)=@_;
my $ua=new LWP::UserAgent;
#不需代理可以注释
if ($proxy) {$ua->proxy(['http','https'],$proxy);}
#不需手机访问可以注释
if ($mobile) {
$ua->agent($iphone);
}else{
$ua->agent($chrome);
}
#不需cookie可以注释
$ua->cookie_jar(HTTP::Cookies->new(file =>$file_cookie,autosave => 1, ignore_discard => 1));
#不需SSL可以注释
$ua->ssl_opts(verify_hostname=>0);
$ua->timeout(4);
my $req=GET($url);
my $res=$ua->request($req);
my $get=$res->content;
return $get;
}
----------------
如果post的时候要上传一个文件,类似这样:
$content{"img"}=[undef,"img.jpg",Header=>"application/octet-stream",Content=>$img];
其实这篇文章讲的不好,需要多多测试,才能弄清楚网络请求这一大堆概念。如果熟练的话,可以编写出自己的myget & mypost,以后就方便多了。
|
|