- 論壇徽章:
- 2
|
Perl使用技巧19:使用get和post請求數(shù)據(jù)
最常用的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;
注意請?zhí)鎿Q為http的網(wǎng)址,我發(fā)不了連接。
get是LWP::Simple中的方法,一次獲得內(nèi)容。
-----------
$res=$ua->get($url);
$get=$res->content;
say $get;
這樣也可以,這個get是ua的方法。
-----------
獲取網(wǎng)絡(luò)請求到文件,這個是LWP::Simple中的方法:
$file="/tmp/get.txt";
getstore($url,$file);
-----------
LWP::UserAgent中關(guān)于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 )
簡單的時候還算好用,如果想仔細(xì)檢查頭部信息的話,就不如分步來提交了,方便調(diào)試。
-----------
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可以提前準(zhǔn)備好:
my %header=(
'Content_Type' => 'multipart/form-data'
);
content也可以提前準(zhǔn)備好:
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' );
對于需要設(shè)置頭部的網(wǎng)絡(luò)請求,最好是Dumper出來看看對不對,否則設(shè)置錯誤是不會請求成功的。
---------------
如果需要設(shè)置瀏覽器信息頭,類似這個樣子:
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];
其實這篇文章講的不好,需要多多測試,才能弄清楚網(wǎng)絡(luò)請求這一大堆概念。如果熟練的話,可以編寫出自己的myget & mypost,以后就方便多了。
|
|