【perl】LWP module

LWP (short for「Library for World Wide Web in Perl」)是一個由多個模塊組成,用來獲取網絡數據的的模塊組。 html

【LWP::Simple】 shell

經過調用 get($url) 函數,就能夠獲得相關網址的內容。若是沒有發生錯誤,get 函數返回此網頁,不然,返回 undef。 瀏覽器

LWP::Simple 在作簡單的工做時很方便。但由於不支持 cookies,用戶認證,對 HTTP request header (請求標頭)的編輯,和 HTTP resonse header(響應標頭)的讀寫(主要是 HTTP 的 error message)。所以,當須要這些特性的時候,就要使用 LWP Class 模型。
服務器

LWP::UserAgent和HTTP::Response  cookie

在衆多的 LWP Class 裏,LWP::UserAgent 和 HTTP::Response 是必須理解的。LWP::UserAgent 就像一個虛擬瀏覽器用來做 request (請求)。HTTP::Response 用來儲存 request (請求) 生成的 response(響應)。 網絡

一個程序裏只須要一個 $browser object,可是每次發出一個 request,就會獲得一個新的 HTTP::Response object。HTTP::Response object 有如下一些有價值的屬性:
一個 status code(狀態代碼值),表示成功或失敗。你能夠使用 $response->is_success 來檢測它。
http status line(http 狀態描述),觀察 $response->status_line 的結果.
app

MIME content-type(文件類型)經過 $response->content_type 來得到。例如 「text/html」,」image/gif」,」application/xml」 等等。
content of the response(響應返回的內容)儲存在 $response->content。內容多是 html 格式。若是是 GIF 格式,$response->content 裏是二進制的 GIF 數據。
許多其餘 methods 均可以在 HTTP::Response 和它的 superclasses (父 class) HTTP::Message 和 HTTP::Headers 裏找到。
dom

添加其餘 HTTP 請求 headers
request (請求) 經常使用的方法是 $response = $browser->get($url),但若是須要,你能夠在 $url 後跟一個鍵值的列表來給你的 request 加上其餘 HTTP headers。象這樣 :
  $response = $browser->get( $url, $key1, $value1, $key2, $value2, … );
ide

舉個例子,若是你要對一個只容許 Netscape 瀏覽器連入的網站發出請求,那就須要發出相似 Netscape 的 header,以下:
 my @ns_headers = (
  ‘User-Agent’ => ‘Mozilla/4.76 [en] (Win98; U)’,
  ‘Accept’ => ‘image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, image/png, **’,
  ‘Accept-Charset’ => ‘iso-8859-1,*,utf-8′,
  ‘Accept-Language’ => ‘en-US’,
 );
若是隻是打算修改 User-Agent,能夠經過 LWP::UserAgent 的 agent 方法把缺省的agent ‘libwww-perl/5.65’(或者別的)改掉。
$browser->agent(‘Mozilla/4.76 [en] (Win98; U)’);
函數

使用 cookies
默認的LWP::UserAgent對象像一個不支持cookies的瀏覽器同樣工做。有不僅一種的辦法能夠設定它的cookie_jar屬性,從而讓它支持cookies。「cookie jar」 是一個用來儲存 HTTP cookie 的容器。你能夠把它存到硬盤(像Netscape使用cookies.txt同樣)或內存裏。存到內存裏的 cookies 會在程序完成後消失。
內存式的 cookie 使用方法:$browser->cookie_jar({});也能夠把 cookie 儲存到硬盤的文件裏:

use HTTP::Cookies;
my $cookies=HTTP::Cookies->new(
   ‘file’ => ‘/some/where/cookies.lwp’, # 儲存 cookies 的地址
   ‘autosave’ => 1,# 當完成後自動儲存到硬盤裏
 )
$browser->cookie_jar($cookies );
文件裏的 cookie 是以 LWP 自定的格式儲存,若是你想在 netscape 裏使用這個 cookie 文件,能夠使用 HTTP::Cookies::Netscape class :

use HTTP::Cookies;# yes, loads HTTP::Cookies::Netscape too
my $ns_cookies=HTTP::Cookies::Netscape->new(
   ‘file’ => ‘c:/Program Files/Netscape/Users/DIR-NAME-HERE/cookies.txt’,
       # where to read cookies
);
$browser->cookie_jar($ns_cookies );
你也能夠象上面同樣使用 ‘autosave’ => 1 。 但 Netscape 的 cookie 有時會在寫入硬盤以前就被丟掉,至少在寫這篇文章的時候仍是這樣。

經過 POST提交表格
大部分HTML表格使用HTML POST 向服務器提交數據,在這裏你能夠這樣:
$response = $browser->post( $url,
  [
    formkey1 => value1,
    formkey2 => value2,
    …
  ],
);
或者你也能夠把 HTTP header 也一塊兒發出
$response = $browser->post( $url,
  [
    formkey1 => value1,
    formkey2 => value2,
    …
  ],
  headerkey1 => value1,
  headerkey2 => value2,
);

使用LWP 訪問 人人網因爲renren訪問用戶資料須要登錄才能完成,因此單純的去抓取確定步行,因此必須模擬登錄記錄cookies,使用lwp模塊能夠完成:


#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Request;
use HTTP::Cookies;
use LWP::UserAgent;
my $url         = 'http://passport.renren.com/PLogin.do';
# 用來存 cookie
my $cookie_jar  = HTTP::Cookies->new(
file        => "./acookies.lwp",
autosave    => 1,
);
# 給處理 cookie 的對象放到 LWP::UserAgent 中來處理 cookie
# 登錄中
my $browser = LWP::UserAgent->new;
my $cookies = $browser->cookie_jar($cookie_jar);
$browser->agent('Mozilla/9 [en] (Centos; Linux)');
my $res     = $browser->post( $url,
[
email     => 'XXXX',
password    => 'XXXXXX',
origURL   =>'http//www.renren.com/home',
domain => 'renren.com',
],
);
#如今能夠訪問裏面的好友了
#$res =$browser->get('http://www.renren.com/home.do');
$res =$browser->get('http://www.renren.com/235018505?pma=p_profile_m_pub_friendslist_a_profile');
print $res->content();

參考:http://blog.mcshell.org/2012/03/19/perl-lwp-simple-use.html

相關文章
相關標籤/搜索