Perl&LWP这本书讲的是Perl 里面用来完成HTTP方法的lib。
开篇有句话写的好。三件事让web服务成为可能:HTML编码、HTTP传递、URL来定位。要理解这三件事,才能透彻的用perl完成浏览器完成的工作。
基于此,用perl完成浏览器完成的工作必须要满足:分析URL、提取HTML、构造HTTP方法、解析HTML。
【开始使用Perl】
#!usr/bin/perl
#test.pl
print 'hello world!';
$perl test.pl
【使用CPAN】
先看看你装了CPAN没有?
%perl -MCPAN eshell
如果是这样的:
CPAN>
ok 你进入了CPAN的shell。在这个shell下你可以安装LWP的模块。
CPAN>install Bundle::LWP
【开始使用LWP】
例1-1 统计O’Reilly主页上提及“Perl”的数目:
#!/usr/bin/perl -w
use strict;#这是什么意思?
use LWP::Simple;
my $catalog = get(“http://www.oreilly.com/catalog”);#使用get方法
my $count = 0;
$count++ while $catalog =~ m{Perl}gi;#进行匹配
print “$count/n”;#打印出统计数目
#中文是天生的注释语言,跟英文放在一起,一目了然^_^
打印出来的结果是
如果get错了,就会返回undef,在perl里undef的意思就是什么都没有。
【LWP::UserAgent】
LWP::Simple是一种最简单的面向对象接口实现。还有更多更强大的实现。如LWP::UserAgent,所谓的用户代理,可以是浏览器,也可以是Paros,也可以是1-2.pl
例1-2 标识服务器
#!/usr/bin/perl -w
use strict;
use LWP;
my $browser = LWP::UserAgent->new( );
my $response = $browser->get(“http://www.oreilly.com/”);#冒充浏览器get网页
print $response->header(“Server”), “/n”;#打印header里面的服务器标识
打印出来的结果是
【LWP::UserAgent的POST方法】
my $browser = LWP::UserAgent->new();
my $response = $browser->post(
‘http://www.example.com′,
['plate' => $plate,
'search' => 'Check Plate Availability'
],
);
这个应该根据你要提交表单的页面内容要拟定。比如提交表单需要的其实是pwusername和pwpassword。
某个表单?
【HTML解析】
例1-4 提取image标签src属性值
#! /usr/bin/perl -w
use strict;
use LWP::Simple;
use HTML::TokeParser;
my $html = get(“http://www.oreilly.com/”);
my $stream = HTML::TokeParser->new(/$html);
my %image = ();#一个新数组
while(my $token = $stream->get_token){
if ($token->[0] eq ‘S’ && $token->[1] eq ‘img’) {
# store src value in %image
$image{ $token->[2]{‘src’} }++;
}
}
foreach my $pic (sort keys %image) {
print “$pic/n”;
}
结果是打印出标记变量。
HTML::TokeParser这个模块对象的get_token()方法,功能是从HTML返回一个标志。
TOken(标志)是数组引用。它的5种可能类型是:开始标志、结束标志、文本标志、注释标志、声明标志。
这里是开始标志,第一个元素是S#$token->[0] eq ‘S’ && $token->[1] eq ‘img’
$image{ $token->[2]{‘src’} }++;#把第三个元素都存进image数组里。
然后我来改一改,打印token的其他
第一个元素
哦,是S
第二个呢
是img
第四个呢
哎呀,看不懂看不懂,其实是包含每个标记属性的散列,最后一个元素是原文
当然还有其他类型的token,简单的说,token就是一种html里面保存信息的结构。解析html,就是把这个结构里的数据读出来,翻译为我们能理解的内容。
一个结束标志有三个元素:E、标志名和原文。
【使用TREE】
例1-5 利用树结构解析图片的地址
#! /usr/bin/perl -w
use strict;
use LWP::Simple;
use HTML::TreeBuilder;
my $html = get(“http://www.oreilly.com/”);
my $root = HTML::TreeBuilder->new_from_content($html);
my %images = ( );
foreach my $node ($root->find_by_tag_name(‘img’)){
$images{$node->attr(‘src’)}++;
}
foreach my $pic (sort keys %images){
print “$pic/n”;
}
使用Tree能够用一些方法更好的进行搜索等。上面这个的打印出来是:
打印出来是树状的img路径
【credentials方法】
LWP::UserAgent的credentials()方法可以添加认证信息(参数为远程机器名称、realm、用户名/密码)。参数relam表示 用户名密码应该输入到哪个受保护的表单或者区域中(有可能存在多个受保护的区域或者表单)。当我们使用LWP::UserAgent对象请求一个页面时, 如果有必要,可以填充认证信息。
参数“realm”是远程服务器要求你输入认证信息的窗口名称,一般情况下,realm是被引号引起来的。此外,查看远程服务器返回的头部信息,realm的值就是header中header中WWW-Authenticate的值,如WWW-Authenticate: Basic realm=”IamRealm”,则realm的值为IamRealm。