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