`
kankan1218
  • 浏览: 271824 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

用LWP简单编写WEB访问的应用 ----需要登陆的网站,保留服务器返回的cookie

    博客分类:
  • perl
阅读更多
LWP 是 Library for WWW access in Perl 的缩写,用途说得很清楚,就是一个访问Web服务器的Perl包。
利用LWP这个包,我们可以很方便的在我们的perl脚本里面访问外部的Web服务器上面的资源。

为什么要用LWP?
现在的网站应用越做越复杂,要想简单的写一个Socket telnet 去用 GET 指令获取资源简直是不可能的,特别是一些需要用口令登陆的网站。
如果你只想简单获取一些资源而不想写太多比较复杂的代码的话,那么就应该选用一个合适的封装起来的HTTPD模块。

我们知道,HTTPD协议是一个面向对象的协议,通常我们把有关的过程抽象为Request,Response,perl本身也支持面向对象编 程,所以Perl的HTTPD包里面也提供了Request,Response对象,同时,把Headers、Cookies,在使用LWP的时候,这些 对象都是必须要引用到的。

下面,我介绍一下关键几个步骤:

1、生成 LWP::UserAgent 的实例:
$ua = LWP::UserAgent->new;

LWP::UserAgent支持代理服务器,这个时候,可以调用 proxy 方法设置一下代理服务器,这样你用LWP发出的信息讲经过你指定的代理服务器转发出去;

$ua->proxy(['http'], $proxy);

2、生成Headers和$cookie_jar对象的实例,并初始化Headers的实例:

$cookie_jar = HTTP::Cookies->new;

$header = new HTTP::Headers
Accept_Language=>'zh-cn',
Content_Type=>"application/x-www-form-urlencoded",
Accept_Encoding=>"gzip, deflate",
Accept=>"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*";

上面我说过,目前很多网站是不能简单的通过一条 GET 指令获取资源的,例如一些 WEB 服务器会检查浏览器发送的信息头,如果没有这些信息头,WEB是不会返回请求的资源的。因此,我们需要认真填写好这些 Headers ,免得服务器拒绝发出的请求的资源。


3、生成request对象的实例,并初始化:

$loginurl="http://reg4.163.com/in.jsp?url=http://sd.gz.163.com/pclubdir/enter.html";
$loginconten="username=szxyz&password=123456&SelectService=0";

$request = HTTP::Request->new(POST=>$loginurl,$header,$loginconten);

第一个参数POST=>$loginurl,由于这个请求对象用POST方法提交信息的,头一个参数,应为:POST=>$loginurl,$loginurl 是提交的URL;
第二参数$header,就是刚才生成的 Headers 的实例;
第三个参数$loginconten,是POST方法提交的信息;

大家细细一看就会发现,其实,这就是一个网易广州社区的登陆动作,下面我将继续就登陆社区为例子介绍怎么使用LWP;

如果我们需要生成一个GET方法的请求对象,这更加简单,只需要把上面的代码改一下就可以,例如我们需要生成一个取网易的首页请求,我们可以这样写:

$url="http://www.yahoo.com"
$request = HTTP::Request->new(GET=>$url,$header);

4、发送请求,并返回一个Response对象的实例,并从Response对象的实例中获取Web服务器的送过来的cookie,将其存放在刚才生成的cookie对象的实例中:
$response = $ua->request($request);
$cookie_jar->extract_cookies($response);

当请求成发送之后,服务器如无意外,就会正确的返回你所请求的信息,而正文的信息保存在 $response->content 当中; 我们可以用打印语句,打印出来看看:
print $response->content;

当我们用口令成功登陆一个网站的时候,该网站的服务器通常会返回一组cookie给浏览器,其后的一段时间中,浏览器每次向网站发送请求的时候,只需将这个cookies发送给服务器,就能通过身份验证,例如网易社区就是如此。

对于这类需要登陆的网站,我们必须保留服务器返回的cookie,并在下次向该服务器发送请求时,把这个cookie也发送出去。由于我们发送的 请求都是封装Request对象的实例中的信息,所以我们只需把cookie对象的实例导入Request对象的实例中即可,然后发送到信息中就含有了该 cookies的信息;
具体的代码就是:

$cookie_jar->add_cookie_header($request);

下面我们用LWP包写一个访问页面为例子的小程序结束这篇文章:

-------------------------------------

#!/usr/bin/perl

require HTTP::Request;
require HTTP::Response;
require HTTP::Headers;
require HTTP::Cookies;
require LWP;

&init();
&main;

sub init {

    $ua         = LWP::UserAgent->new;
    $cookie_jar = HTTP::Cookies->new;

    $header = new HTTP::Headers
      Accept_Language => 'zh-cn',
      Content_Type    => "application/x-www-form-urlencoded",
      Accept_Encoding => "gzip, deflate",
      Accept =>
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*";

}

sub get {

    my $url;

    ($purl) = @_;

    $request = HTTP::Request->new( GET => $purl, $header );
    $cookie_jar->add_cookie_header($request);
    $response = $ua->request($request);
    $cookie_jar->extract_cookies($response);

}

sub main {

    $myurl = "http://cn.yahoo.com/";

    &get($myurl);
    print $response->content;

}

-------------------------------------

实际上,只要细心的阅读Perl附带文档,了解各对象的调用关系,LWP是很简单易学上手的,而且功能比较齐全,用途也比较广泛,例如我们写一些新闻抓取工具,蜘蛛程序,搜索引擎登陆程序,利用LWP再加上Perl的超强的文本出来功能,这将显得十分方便快捷。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics