加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl中LWP与WEB的基本使用

发布时间:2020-12-15 23:52:03 所属栏目:大数据 来源:网络整理
导读:perl中LWP与WEB的基本使用 取自 PerlChina.org - wiki LWP 与 WEB 的基本使用 翻 译:qiang 审 校:klaus 出 处:中国 Perl 协会 原 名:Web Basics with LWP 作 者:Sean M. Burke - Perl LWP 作者(O'Reilly出版) 原 文:http://www.perl.com/pub/a/2002/08

perl中LWP与WEB的基本使用
取自 PerlChina.org - wiki
LWP 与 WEB 的基本使用

翻 译:qiang
审 校:klaus
出 处:中国 Perl 协会
原 名:Web Basics with LWP
作 者:Sean M. Burke - Perl & LWP 作者(O'Reilly出版)
原 文:http://www.perl.com/pub/a/2002/08/20/perlandlwp.html
发 表:2002-08-20

?

目录
[隐藏]
1 简介
2 使用 LWP::Simple 获取网页
3 LWP Class 模型基础
4 添加其他 HTTP 请求 headers
5 使用 cookies
6 通过 POST提交表格
7 通过 GET 提交表格
8 URL 处理
9 其他浏览器属性
10 写一个有礼貌的机器人
11 使用代理
12 HTTP 认证
13 连接 HTTPs URLs
14 获取大文件
15 资源
16 与 Sean Burke 讨论后的一些笔记
?

?


[编辑] 简介
LWP ("Library for WWW in Perl" 的缩写) 是一个由多个模块组成,用来获取网络数据的的模块组。 和很多Perl 的模块一样。每一个 LWP 模块都自带详细的文档,做为对这个模块的完整介绍。可是面对 LWP里的众多模块,有时候即使是完成最简单的工作,新手们也常常不知道从那里开始。

要对 LWP 做全面的介绍需要一整本书,很幸运,Perl & LWP已经出版。而这篇文章向你介绍了最常见的 LWP 用法。

[编辑] 使用 LWP::Simple 获取网页
如果只是要拿到某个网页,那使用 LWP::Simple 里的函数是最简单的。

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

? my $url ='http://freshair.npr.org/dayFA.cfm?todayDate=current'

? use LWP::Simple;
?
my $content = get $url;
?
die "Couldn't get $url" unless defined$content;

? #? $content里是网页内容,下面是对此内容作些分析:

? if($content =~ m/jazz/i) {
?
?? print"They're talking about jazz today on Fresh Air!n";
?
} else {
?
?? print "FreshAir is apparently jazzless today.n";
?
}
如果要在命令行里运行,getprint 函数非常方便。如果没有发生错误,它会把网页内容输出到 STDOUT,否则将会有错误信息输出到STDERR。 例如:

?? % perl -MLWP::Simple -e"getprint 'http://cpan.org/RECENT'"
上面的网址指向一个文本文件,列有最近两个星期内 CPAN 更新过的文件。如果想要知道 Acme:: 的模块是否有更新,有就email自己,你可以把它和 Shell 结合到一起来实现。如下:

? % perl -MLWP::Simple -e "getprint'http://cpan.org/RECENT'"?
?
???| grep "/by-module/Acme" | mail -s "New Acme modules! Joy!"$USER
LWP::Simple还有一些非常有用的函数,包括一个运行HEAD请求的函数,用来检查链接是否有效,网页是否更新。另外两个用来保存和镜像网址的函数也值得一提。具体请看LWP::Simple 的文档或 Perl & LWP 的第二章.

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

在众多的 LWP Class 里,LWP::UserAgent 和 HTTP::Response是必须理解的。LWP::UserAgent 就像一个虚拟浏览器用来作 request (请求)。HTTP::Response 用来储存request (请求) 生成的 response(响应)。

最基本的用法是 $response = $browser->get($url),或写的更完整些:

? # 程序开始:
?

?
use LWP 5.64; # 载入较新版本的 LWP classes

? my $browser =LWP::UserAgent->new;
?

?
...
?

?
# get request:
?
my $url ='http://freshair.npr.org/dayFA.cfm?todayDate=current';
?

?
my $response = $browser->get($url );
?
die "Can't get $url -- ",$response->status_line
?
? unless$response->is_success;

? die "Hey,我想要 HTML 格式而不是 ",$response->content_type
?
? unless$response->content_type eq 'text/html';
?
???# 或者任何其他的 content-type

? # 成功的话就对内容处理
?

?
if($response->content =~m/jazz/i) {
?
?? print "FreshAir 今天在讨论爵士乐!n";
?
} else {
?
?? print "FreshAir 今天讨论的和爵士乐一点边都不沾.n";
?
}
上面有两个相关的 object: $browser,是 LWP::UserAgent 的一个object。$response 是属于HTTP::Response 类的一个object。一个程序里只需要一个 $browser object,但是每次发出一个request,就会得到一个新的 HTTP::Response object。

HTTP::Response object 有以下一些有价值的属性:
一个 status code(状态代码值),表示成功或失败。你可以使用$response->is_success 来检测它。
http status line(http 状态描述),观察$response->status_line 的结果 ( 比如 "404 Not Found" )会帮助你理解这个词的意思。
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。“cookiejar” 是一个用来储存 HTTP cookie的容器。你可以把它存到硬盘(像Netscape使用cookies.txt一样)或内存里。存到内存里的 cookies会在程序完成后消失。

内存式的 cookie 使用方法:

$browser->cookie_jar({});也可以把 cookie储存到硬盘的文件里:

?use HTTP::Cookies;
?
$browser->cookie_jar(HTTP::Cookies->new(
?
?? 'file'=> '/some/where/cookies.lwp',
?
??????# 储存 cookies 的地址
?
?? 'autosave'=> 1,
?
??????# 当完成后自动储存到硬盘里
?
));
文件里的 cookie 是以 LWP 自定的格式储存,如果你想在 netscape 里使用这个 cookie 文件,可以使用HTTP::Cookies::Netscape class :

? use HTTP::Cookies;
?
?? # yes,loadsHTTP::Cookies::Netscape too
?

?
$browser->cookie_jar(HTTP::Cookies::Netscape->new(
?
?? 'file'=> 'c:/ProgramFiles/Netscape/Users/DIR-NAME-HERE/cookies.txt',
?
??????# where to read cookies
?
));
你也可以象上面一样使用 'autosave' => 1 。 但 Netscape 的 cookie有时会在写入硬盘之前就被丢掉,至少在写这篇文章的时候还是这样。

[编辑] 通过 POST提交表格
大部分HTML表格使用HTML POST 向服务器提交数据,在这里你可以这样:

?$response = $browser->post($url,
?
? [
?
???formkey1 => value1,
?
???formkey2 => value2,
?
???...
?
? ],
?
);
或者你也可以把 HTTP header 也一起发出

?$response = $browser->post($url,
?
? headerkey1 =>value1,
?
? headerkey2 =>value2,
?
);
下一个例子向 AltaVista 的搜索引擎发送 HTTP POST 请求,然后从HTML里提取出符合匹配的总数。

? use strict;
?
use warnings;
?
use LWP 5.64;
?
my $browser =LWP::UserAgent->new;
?

?
my $word = 'tarragon';
?

?
my $url ='http://www.altavista.com/sites/search/web';
?
my $response = $browser->post($url,
?
?? [ 'q'=> $word,? # the Altavista querystring
?
????'pg' => 'q','avkw' => 'tgz','kl'=> 'XX',
?
?? ]
?
);
?
die "$url error: ",$response->status_line
?
? unless$response->is_success;
?
die "Weird content type at $url -- ",$response->content_type
?
? unless$response->content_type eq 'text/html';

? if( $response->content =~m{AltaVista found ([0-9,]+) results} ) {
?
?? # 从"AltaVista found 2,345 results" 里匹配出结果
?
?? print"$word: $1n";
?
} else {
?
?? print"Couldn't find the match-string in the responsen";
?
}
[编辑] 通过 GET 提交表格
一些HTML表格不使用 POST 请求,而是使用 GET 请求来传输数据。例如,在 imdb.com 里检索电影名字 'BladeRunner',提交后在浏览器的网址栏里将显示 :

? http://us.imdb.com/Tsearch?title=Blade%20Runner&restrict=Movies+and+TV
下面是使用 LWP 实现同样的结果 :

? use URI;
?
my $url = URI->new('http://us.imdb.com/Tsearch' );
?
?? # makes anobject representing the URL
?

?
$url->query_form(? # And here theform data pairs:
?
??'title'???=> 'Blade Runner',
?
?? 'restrict'=> 'Movies and TV',
?
);
?

?
my $response =$browser->get($url);
第5章详细描述了 HTML 表格和表格数据,第6章到第9章描述了怎样从获得的HTML数据里提取出有用的信息。

[编辑] URL 处理
上面提到的 URI 提供很多获取和修改 URL 的方法。例如 如果想要知道 url 是什么类型 (http,ftp 等等) 可以使用$url->schema 来得到,如果要提取网址里的主机名,可以使用$url->host。不过,可能最有用的是我前面提到的 query_form方法,以及把相对网址路径(如"../foo.html")转换成绝对路径(如"http://www.perl.com/stuff/foo.html")的new_abs 方法。例子如下:

? use URI;
?
$abs =URI->new_abs($maybe_relative,$base);
现在回忆一下获取最新 CPAN 模块的那个例子。

? use strict;
?
use warnings;
?
use LWP 5.64;
?
my $browser =LWP::UserAgent->new;
?

?
my $url ='http://www.cpan.org/RECENT.html';
?
my $response =$browser->get($url);
?
die "Can't get $url -- ",$response->status_line
?
? unless$response->is_success;
?

?
my $html =$response->content;
?
while( $html =~ m/&;AHREF="(.*?)"/g ){???
?
????print "$1n";?
?
}
输出的结果是

? MIRRORING.FROM
?
RECENT
?
RECENT.html
?
authors/00whois.html
?
authors/01mailrc.txt.gz
?
authors/id/A/AA/AASSAD/CHECKSUMS
?
...
你可以使用 URI 模块的 new_abs 方法来得到完全网址路径,修改 while 循环:

? while( $html =~ m/<AHREF="(.*?)"/g ){???
?
????print URI->new_abs( $1,$response->base ),"n";
?
}
$response->base 方法可以在 HTTP::Message 里找到。它返回的 URL通常被用来和相对路径合并来得到完全路径。现在得到的结果是

? http://www.cpan.org/MIRRORING.FROM
?
http://www.cpan.org/RECENT
?
http://www.cpan.org/RECENT.html
?
http://www.cpan.org/authors/00whois.html
?
http://www.cpan.org/authors/01mailrc.txt.gz
?
http://www.cpan.org/authors/id/A/AA/AASSAD/CHECKSUMS
?
...
请参考 Perl & LWP 的第四章,以得到对 URI objects 更详细的描述。

当然,使用 regexp (正则表达式) 来匹配 url 相对简单,如果情况复杂,需要更强大的匹配工具,可以考虑 HTML分析模块 HTML::LinkExtor 或 HTML::TokeParser,甚至 HTML::TreeBuilder

[编辑] 其他浏览器属性
LWP::UserAgent objects 有几个值得注意的属性 :

$browser->timeout(15): 设定缺省 request 的 timeout时间.超过这个时间就放弃请求。
$browser->protocols_allowed( [ 'http','gopher'] ):这用来设定只接受 http 和 gopher 协议。连接其他协议时就返回 500 错误值,"Access to ftp URIshas been disabled" 的错误消息。
这告诉 browser object 使用 HTTP/1.1 "keep-Alive" 特性,即重复使用先前的 socket来加快请求速度。
use LWP::ConnCache;
$browser->conn_cache(LWP::ConnCache->new()):
?
$browser->agent( 'SomeName/1.23(more info here maybe)' ): 设置 HTTP 请求的 User-Agent。LWP 缺省使用"libwww-perl/versionnumber" 作为 User-Agent,比如"libwww-perl/5.65"。
你可以加上更多的信息:
$browser->agent( 'SomeName/3.14 (contact@robotplexus.int)');
或者可以伪装为
$browser->agent( 'Mozilla/4.0 (compatible; MSIE5.12; Mac_PowerPC)' );
push @{ $ua->requests_redirectable },'POST': 告诉 LWP在 POST 请求发送后如果发生重新定向就自动跟随 ( 虽然 RFC 里不要求这么做 ) , 详细请参见 LWP::UserAgent文档
[编辑] 写一个有礼貌的机器人
如果想遵循 robots.txt 和避免在较短的时间发出太多的请求,你可以采用 LWP::RobotUA 而不是LWP::UserAgent。

LWP::RobotUA 用法与 LWP::UserAgent 一样:

? use LWP::RobotUA;
?
my $browser =LWP::RobotUA->new(
?
??'YourSuperBot/1.34','you@yoursite.com');
?
?? # 机器人名字和email 地址

? my $response =$browser->get($url);
HTTP::RobotUA 多了几个特性:

如果 $url 请求的服务器的 robots.txt 禁止了你对 $url的访问,那么 $browser就不会发出对于这个地址的请求,而是返回 403 代码和一个错误信息 "Forbidden by robots.txt"。
?
?? die "$url --",$response->status_line,"nAborted"
?
? unless$response->is_success;
然后你会得到这样的错误信息:

?
?
????http://whatever.site.int/pith/x.html-- 403 Forbidden
?
????by robots.txt
?
????Aborted at whateverprogram.pl line 1234
如果 $browser 发现请求的地址是刚刚请求过的,就会暂停 (sleep) 来避免发送太多的请求。缺省暂停 1 分钟,但可以通过$browser->delay( minutes ) 来设定。比如:
?
???$browser->delay( 7/60 );
详细请参见 LWP::RobotUA文档

[编辑] 使用代理
有时你希望(或者是必须)通过代理来连接某些站点或协议,就比如你的LWP程序是运行在某台处于防火墙之内的机器上。

代理通常储存在环境变量 HTTP_PROXY 里。LWP 可以通过 user-agent object 里的 env_proxy函数把环境变量里的代理地址装载。

? use LWP::UserAgent;
?
my $browser =LWP::UserAgent->new;
?

?
# And before you go making any requests:
?
$browser->env_proxy;
详细请参照 LWP::UserAgent 文档里的 proxy,env_proxy 和 no_proxy 方法

[编辑] HTTP 认证
许多网站都是通过 HTTP 认证来限制连接. 当用户请求一个限制页面时,HTTP 服务器回复 "That document ispart of a protected 'realm' and you can access it only if youre-request it and add some special authorization headers to yourrequest". ( 你现在请求了一个限制区域,如果你需要重新发送一个带有认证信息的 header 才可以连入. )

Unicode.org 的管理员为了防止机器人访问邮件组获取发信人地址,要求先进行 HTTP认证。用户名和密码是公开的:用户名: unicode-ml 密码: unicode

假设一个限制页面的地址是

http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html

如果你在浏览器里请求这个地址,一个新的窗口跳出,显示 "Enter username and password for'Unicode-MailList-Archives' at server'www.unicode.org'"。请你输入用户名和密码,就像这样:

?

单纯使用 LWP 请求这个网址 :

? use LWP 5.64;
?
my $browser =LWP::UserAgent->new;

? my $url =
?
?'http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html';
?
my $response =$browser->get($url);

? die "Error: ",$response->header('WWW-Authenticate') ||
?
?? 'Erroraccessing',
?
??#? ('WWW-Authenticate' is the realm-name)
?
?? "n ","n at $urlnAborting"
?
? unless$response->is_success;
你将得到以下错误:

?? Error: Basicrealm="Unicode-MailList-Archives"
?
? 401 AuthorizationRequired
?
? at http://www.unicode.org/mail-arch/unicode-ml/y2002-m08/0067.html
?
? Aborting at auth1.pl line9.? [or wherever]
这是因为 LWP 不知道 host www.unicode.org 里的"Unicode-MailList-Archives" 区的用户名和地址。解决这个问题最简单的方法是使用 credentials方法来提供用户名和密码:

??$browser->credentials(
?
??'servername:portnumber',
?
??'realm-name',
?
?? 'username'=> 'password'
?
);
通常,端口是 80. credentials 函数要在发请求之前调用.比如:

? $browser->credentials(
?
??'reports.mybazouki.com:80',
?
??'web_server_usage_reports',
?
?? 'plinky'=> 'banjo123'
?
);
我们的 unicode.org 的例子可以写成

?$browser->credentials(? # add thisto our $browser 's "key ring"
?
??'www.unicode.org:80',
?
??'Unicode-MailList-Archives',
?
?? 'unicode-ml'=> 'unicode'
?
);
[编辑] 连接 HTTPs URLs
只要有安装 LWP 的HTTPs 的支持,访问 HTTPs URLs 的方法和 HTTP 一样

? use LWP 5.64;
?
my $url ='https://www.paypal.com/';?? #Yes,HTTPS!
?
my $browser =LWP::UserAgent->new;
?
my $response =$browser->get($url);
?
die "Error at $urln ","n Aborting"
?
? unless$response->is_success;

? print "Whee,it worked!? Igot that ",
?
?$response->content_type," document!n";
如果没有 HTTPs 的支持,如下错误信息会显示

?? Error at https://www.paypal.com/
?
? 501 Protocol scheme 'https' isnot supported
?
? Aborting at paypal.pl line7.?? [or whatever program andline]
如果你安装了 LWP 的 HTTPS 支持的话,你的请求应该是成功的,你可以像对待普通的 HTTP 请求一样处理 $response对象。

关于安装 HTTPS 支持的信息可以在libwww-perl 里的README.SSL 文件找到.

[编辑] 获取大文件
请求较大的文件时,普通的请求方法 ( 例如 $response =$browser->get($url) ) 会给你带来内存问题. 因为 $response储存着整个文件. 如果请求了一个 30MB 的文件,那可能不是什么明智的做法.

一个解决方法是把文件存到硬盘

?? $response =$ua->get($url,
?
???????????????????????':content_file' => $filespec,
?
????????????????????);
比如:

? $response =$ua->get('http://search.cpan.org/',
?
???????????????????????':content_file' => '/tmp/sco.html'
?
????????????????????);

当使用 content_file 时,headers 还是在$response,但$response->content 是空.

值得注意的是LWP 5.66 之前的版本不支持content_file . 你应该使用 use LWP 5.66;如果你的程序可能运行在低版本的 LWP 上,你也可以使用下面的例子来保证兼容性,这与 content_file有同样效果.

? use HTTP::Request::Common;
?
$response = $ua->request(GET($url),$filespec );
[编辑] 资源
以上只是对 LWP 常用函数的简介,如果想了解更多关于 LWP 和 LWP 相关的东西,请参阅以下文档

LWP::Simple: 提供简易的 get,head,mirror 方法.
LWP: libwww-perl 模块的综述
LWP::UserAgent: 代表了一个虚拟浏览器.
HTTP::Response: 发出 LWP 请求后所得到的响应,$response =$browser->get(...).
HTTP::Message and HTTP::Headers: HTTP::Response 很多方法都是来自两者.
URI: Class 处理完全和相对网址路径.
URI::Escape: 来正确处理和转换 URL 里的不规则字符 (比如 "this & that"和 "this%20%26%20that" 之间的转换).
HTML::Entities: 来正确处理和转换 HTML 里的不规则字符 (比如 "C. & E.Bront??" 和 "C. & E. Bront?" 之间的转换).
HTML::TokeParser and HTML::TreeBuilder: 分析 HTML
HTML::LinkExtor: 在 HTML 找到链接
当然还有我的 Perl & LWP
[编辑] 与 Sean Burke 讨论后的一些笔记
在翻译这篇文章的时候,我联系到了文章作者,Sean Burke. 他同意把原文章里需要补充和更新的地方指出. 我与作者也通过 MSN交流了一下. 这里我把自己对 LWP 的理解和作者的补充写在这里.

在文章里提到了使用
?
???use LWP::ConnCache;<br>
?
???$browser->conn_cache(LWP::ConnCache->new()):?
这告诉 browser object 使用 HTTP/1.1 "keep-Alive" 特性,即重复使用先前的 socket来加快请求速度. 你也可以在 new LWP::UserAgent 时为 $browser 加上 "keep-Alive" 特性,如下

?????use LWP;
?
????$browser = new LWP::UserAgent(keep_alive =>1);
不要忘记 response object 的 header 通常有很多非常值得注意的信息,你可以通过headers_as_string 和 as_string 函数来得到. 下面是使用 headers_as_string返回的例子
?
???use LWP;
?
???my $br = LWP::UserAgent->new;
?
???my $resp = $br->get('http://www.pulse24.com');
?
???print $resp->headers_as_string";

????输出结果:

????Cache-Control: private,max-age=0
?
???Connection: close
?
???Date: Sun,16 Jan 2005 04:18:26 GMT
?
???Server: Microsoft-IIS/6.0
?
???Content-Length: 432
?
???Content-Type: text/html
?
???Content-Type: text/html; charset=iso8859-1
?
???Client-Date: Sun,16 Jan 2005 04:18:09 GMT
?
???Client-Peer: 207.61.136.40:80
?
???Client-Response-Num: 1
?
???REFRESH: 0;URL=http://www.pulse24.com/Front_Page/page.asp
?
???X-Meta-Robots: noindex
?
???X-Powered-By: ASP.NET
你也可以通过 $response->header('field') 来获得想要的特别 header.象上面的例子,如果要访问的网页使用了 meta refresh :

<META HTTP-EQUIV="REFRESH"CONTENT="0;URL=http://www.pulse24.com/Front_Page/page.asp">你可以使用$response->header('refresh') 来拿到 refresh 的 url 地址,选择是否继续跟进.

LWP::UserAgent 支持 4 种 HTTP 地址重定向,http status code 分别是:301 MovedPermanently,302 Found,303 See Other,307 Temporary Redirect

注:在以上的HTTP 地址重定向基础上,LWP 缺省支持 'Head' 和 'Get' 方法的地址重定向跟踪。如果你想跟踪'POST' 的地址重定向,需要以下声明 ($ua 是 LWP::UserAgent 的一个对象)。这主要用于使用 Post方法提交表格后的地址重定向。

push @{ $ua->requests_redirectable },'POST';有些时候,浏览器可以正常访问到的地址,LWP 却不行. 一般是因为你的 LWP 的 header,referer,cookie 或 user-agent 等的设定与对方网络服务器允许连入的不同. 为了找到问题所在,你需要比较浏览器发出的请求和你的 LWP 发出的请求有何不同,然后修改再尝试. 很多时候这是反反复复的工作. 我最早使用Ethereal 来监视,抓取数据,目前使用 Firefox 的 LiveHTTPHeaders 插件. 现在LWP也自带一个数据分析模块 http://search.cpan.org/~gaas/libwww-perl-5.803/lib/LWP/DebugFile.pm'>LWP::DebugFile来帮助你找到问题.
另外,文章里提到了 HTTP::Cookies::Netscape,现在LWP Cookies 模块支持更多浏览器:Mozilla,Safari,Omniweb
很多时候表格与 javascript 一起使用,LWP 没有分析 Javascript 的引擎,所以你必须分析网页源码里Javascript 来决定怎样处理.
function Submit()
{
?
??????????????.........
?
self.document.location.href="verify.php";

?return false;
}


........

<form>
......

<input type=button value="Submit your page"onClick="javascript:Submit();return false;//">

上面的这个例子通过表格提交来触动 javascript 的 submit 函数,最后调用了 verify.php.现在你就可以跳过所有的 javascript 而直接对 verify.php 来提交.?

?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eroswang/archive/2007/09/28/1805434.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读