【perl】LWP module

LWP (short for“Library for World Wide Web in Perl”)是一个由多个模块组成,用来获取网络数据的的模块组。

【LWP::Simple】

通过调用 get($url) 函数,就可以得到相关网址的内容。如果没有发生错误,get 函数返回此网页,否则,返回 undef。

LWP::Simple 在做简单的工作时很方便。但因为不支持 cookies,用户认证,对 HTTP request header (请求标头)的编辑,和 HTTP resonse header(响应标头)的读写(主要是 HTTP 的 error message)。因此,当需要这些特性的时候,就要使用 LWP Class 模型。

【LWP::UserAgent和HTTP::Response 】

在众多的 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 的结果.

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 里找到。

添加其他 HTTP 请求 headers
request (请求) 常用的方法是 $response = $browser->get($url),但如果需要,你可以在 $url 后跟一个键值的列表来给你的 request 加上其他 HTTP headers。象这样 :
  $response = $browser->get( $url, $key1, $value1, $key2, $value2, … );

举个例子,如果你要对一个只允许 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

时间: 2024-11-24 18:04:37

【perl】LWP module的相关文章

【perl】使用mysql问题

[error] install_driver(mysql) failed: Global symbol "$VERSION" requires explicit package name at /mtkoss/perl/5.14.2-ubuntu-12.04/x86_64/lib/site_perl/5.14.2/x86_64-linux-thread-multi/DBD/mysql.pm line 6. Compilation failed in require at (eval 3

【JavaScript】设计模式-module模式及其改进

写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 说到这里...... <head first设计模式>里有一篇文章,是说使用模式的心智, 1.初学者"心智" :"我要为HELLO WORLD找个模式" 2.中级人员模式: "或许这里我需要一个单件模式" 3.悟道者心智:"在这里使用一个装饰者模式相当自然" but,but,but,不学,连初学者

【linux】grep 和【perl】 脚本实现的grep功能的运行时间差异

参考在网上找到的代码,没想到相差那么大,目前有个项目要对50GB~70GB的代码,260个关键字做扫描,急需一个比较快速的方案. [[email protected] stat]$ wc -l 1 234033 1 [[email protected] stat]$ perl 1.pl cost 1 seconds zjtel : 32606 [[email protected] stat]$ perl 2.pl cost 111 seconds zjtel : 32606 1.pl #!/us

【LeetCode】数组

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [1]Two Sum [4]Median of Two Sorted Arrays [11]Container With Most Water [15]3Sum [16]3Sum Closest [18]4Sum [26]Remove Duplicates from Sorted Array [27]Remove Element [31]Next Permutatio

【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)

第一部分---线段树:https://leetcode.com/tag/segment-tree/ p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [218]The Skyline Problem [307]Range Sum Query - Mutable [308]Range Sum Query 2D - Mutable [315]Count of Smaller Numbers After Self [493

【LeetCode】二叉查找树 binary search tree(共14题)

链接:https://leetcode.com/tag/binary-search-tree/ p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [220]Contains Duplicate III [315]Count of Smaller Numbers After Self [327]Count of Range Sum [352]Data Stream as Disjoint Intervals [493]

Perl数据库DBI接口简介【转载】

本文转载自:http://blog.csdn.net/like_zhz/article/details/5441946 ##########################################################################可移植的DBI方法:connect    建立到一个数据库服务器的连接disconnect   断开数据库服务器的连接prepare    准备执行一个SQL语句execute    执行准备好的语句do    准备并执行一个SQL

【AngularJs】---Error: [$injector:modulerr] Failed to instantiate module starter.services

[遇到问题解决问题,原谅我这个菜鸟] 加了services angular.module('starter', ['ionic', 'starter.controllers', 'starter.services']) 出现下面问题 [原因] index.html没有引入services.js ~~~~(>_<)~~~~

python3中用HTMLTestRunner.py报ImportError: No module named &#39;StringIO&#39;如何解决【转载】

原文转自:http://bbs.chinaunix.net/thread-4154743-1-1.html python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'的解决方法: 1.原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法: 参考:http://bbs.chinaunix.net/thread-4154743-1-1.html 下载地址:http:/