




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LWP 与 WEB 的基本使用简介LWP (“Library for WWW in Perl” 的缩写) 是一个由多个模块组成,用来获取网络数据的的模块组。 和很多 Perl 的模块一样。每一个 LWP 模块都自带详细的文档,做为对这个模块的完整介绍。可是面对 LWP 里的众多模块,有时候即使是完成最简单的工作,新手们也常常不知道从那里开始。要对 LWP 做全面的介绍需要一整本书,很幸运,Perl & LWP 已经出版。而这篇文章向你介绍了最常见的 LWP 用法。使用 LWP:Simple 获取网页如果只是要拿到某个网页,那使用 LWP:Simple 里的函数是最简单的。通过调用 get($url) 函数,就可以得到相关网址的内容。如果没有发生错误,get 函数返回此网页,否则,返回 undef。例子如下: my $url = /dayFA.cfm?todayDate=current use LWP:Simple; my $content = get $url; die Couldnt get $url unless defined $content; # $content 里是网页内容,下面是对此内容作些分析: if($content = m/jazz/i) print Theyre talking about jazz today on Fresh Air!n; else print Fresh Air is apparently jazzless today.n; 如果要在命令行里运行,getprint 函数非常方便。如果没有发生错误,它会把网页内容输出到 STDOUT,否则将会有错误信息输出到 STDERR。 例如: % perl -MLWP:Simple -e getprint /RECENT上面的网址指向一个文本文件,列有最近两个星期内 CPAN 更新过的文件。如果想要知道 Acme: 的模块是否有更新,有就email 自己,你可以把它和 Shell 结合到一起来实现。如下: % perl -MLWP:Simple -e getprint /RECENT | grep /by-module/Acme | mail -s New Acme modules! Joy! $USERLWP:Simple 还有一些非常有用的函数,包括一个运行HEAD请求的函数,用来检查链接是否有效,网页是否更新。另外两个用来保存和镜像网址的函数也值得一提。具体请看 LWP:Simple 的文档或 Perl & LWP 的第二章.LWP Class 模型基础LWP:Simple 在做简单的工作时很方便。但因为不支持 cookies,用户认证,对 HTTP request header (请求标头)的编辑,和 HTTP resonse header(响应标头)的读写(主要是 HTTP 的 error message)。因此,当需要这些特性的时候,就要使用 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 = /dayFA.cfm?todayDate=current; my $response = $browser-get( $url ); die Cant 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 Fresh Air 今天在讨论爵士乐!n; else print Fresh Air 今天讨论的和爵士乐一点边都不沾.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 请求 headersrequest (请求) 常用的方法是 $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, ); . $response = $browser-get($url, ns_headers);如果不打算重复使用这个 array,你可以把它写到 get 函数里 $response = $browser-get($url, 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; $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, loads HTTP:Cookies:Netscape too $browser-cookie_jar( HTTP:Cookies:Netscape-new( file = c:/Program Files/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, formkey1 = value1, formkey2 = value2, . , 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 = /sites/search/web; my $response = $browser-post( $url, q = $word, # the Altavista query string 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 = mAltaVista found (0-9,+) results ) # 从 AltaVista found 2,345 results 里匹配出结果 print $word: n; else print Couldnt find the match-string in the responsen; 通过 GET 提交表格一些HTML表格不使用 POST 请求,而是使用 GET 请求来传输数据。例如,在 里检索电影名字 Blade Runner, 提交后在浏览器的网址栏里将显示 : /Tsearch?title=Blade%20Runner&restrict=Movies+and+TV下面是使用 LWP 实现同样的结果 : use URI; my $url = URI-new( /Tsearch ); # makes an object representing the URL $url-query_form( # And here the form data pairs: title = Blade Runner, restrict = Movies and TV, ); my $response = $browser-get($url);第5章详细描述了 HTML 表格和表格数据,第6章到第9章描述了怎样从获得的HTML数据里提取出有用的信息。URL 处理上面提到的 URI class 提供很多获取和修改 URL 的方法。例如 如果想要知道 url 是什么类型 (http, ftp 等等) 可以使用 $url-schema 来得到,如果要提取网址里的主机名,可以使用 $url-host。不过,可能最有用的是我前面提到的 query_form 方法,以及把相对网址路径(如”./foo.html”)转换成绝对路径(如”/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 = /RECENT.html; my $response = $browser-get($url); die Cant get $url - , $response-status_line unless $response-is_success; my $html = $response-content; while( $html = m/chunk86920392chunklt;A HREF=(.*?)/g ) print n; 输出的结果是 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/new_abs( , $response-base ) ,n; $response-base 方法可以在 HTTP:Message 里找到。它返回的 URL 通常被用来和相对路径合并来得到完全路径。现在得到的结果是 /MIRRORING.FROM /RECENT /RECENT.html /authors/00whois.html /authors/01mailrc.txt.gz /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 URIs has been disabled” 的错误消息。 use LWP:ConnCache; $browser-conn_cache(LWP:ConnCache-new(): 这告诉 browser object 使用 HTTP/1.1 “keep-Alive” 特性,即重复使用先前的 socket 来加快请求速度。 $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 () );或者可以伪装为 $browser-agent( Mozilla/4.0 (compatible; MSIE 5.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, ); # 机器人名字和 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;然后你会得到这样的错误信息: /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 is part of a protected realm and you can access it only if you re-request it and add some special authorization headers to your request”. ( 你现在请求了一个限制区域 , 如果你需要重新发送一个带有认证信息的 header 才可以连入. )U 的管理员为了防止机器人访问邮件组获取发信人地址,要求先进行 HTTP 认证。用户名和密码是公开的:用户名: unicode-ml 密码: unicode假设一个限制页面的地址是 /mail-arch/unicode-ml/y2002-m08/0067.html如果你在浏览器里请求这个地址,一个新的窗口跳出,显示 “Enter username and password for Unicode-MailList-Archives at server ”。请你输入用户名和密码,就像这样:单纯使用 LWP 请求这个网址 : use LWP 5.64; my $browser = LWP:UserAgent-new; my $url = /mail-arch/unicode-ml/y2002-m08/0067.html; my $response = $browser-get($url); die Error: , $response-header(WWW-Authenticate) | Error accessing, # (WWW-Authenticate is the realm-name) n , $response-status_line, n at $urln Aborting unless $response-is_success;你将得到以下错误: Error: Basic realm=Unicode-MailList-Archives 401 Authorization Required at /mail-arch/unicode-ml/y2002-m08/0067.html Aborting at auth1.pl line 9. or wherever这是因为 LWP 不知道 host 里的 “Unicode-MailList-Archives” 区的用户名和地址。解决这个问题最简单的方法是使用 credentials 方法来提供用户名和密码: $browser-credentials( servername:portnumber, realm-name, username = password );通常, 端口是 80. credentials 函数要在发请求之前调用.比如: $browser-credentials( :80, web_server_usage_reports, plinky = banjo123 );我们的 的例子可以写成 $browser-credentials( # add this to our $browser s key ring :80, Unicode-MailList-Archives, unicode-ml = unicode );连接 HTTPs URLs只要有安装 LWP 的HTTPs 的支持, 访问 HTTPs URLs 的方法和 HTTP 一样 use LWP 5.64; my $url = /; # Yes, HTTPS! my $browser = LWP:UserAgent-new; my $response = $browser-get($url); die Error at $urln , $response-status_line, n Aborting unless $response-is_success; print Whee, it worked! I got that , $response-content_type, document!n;如果没有 HTTPs 的支持, 如下错误信息会显示 Error at / 501 Protocol scheme https is not supported Aborting at paypal.pl line 7. or whatever program and line如果你安装了 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(/, :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 模块的综述 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: Classes 分析 HTML HTML:LinkExtor: Class :在 HTML 找到链接 当然还有我的 Perl & LWP.与 Sean Burke 讨论后的一些笔记在翻译这篇文章的时候,我联系到了文章作者, Sean Burke. 他同意把原文章里需要补充和更新的地方指出. 我与作者也通过 MSN 交流了一下. 这里我把自己对 LWP 的理解和作者的补充写在这里. 在文章里提到了使用 use LWP:ConnCache; $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); 不要忘记 respo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025包头交通投资集团招聘工作人员笔试模拟试题及答案解析
- 2025年下半年潍坊理工学院教师招聘(178人)备考考试题库附答案解析
- 工厂安全培训演讲公式课件
- 2025年河北邢台市信都区招聘事业单位工作人员89人备考考试题库附答案解析
- 交强险风险分担机制优化-洞察及研究
- 长脉宽NdYAG临床应用-洞察及研究
- 物联网隐私保护挖掘-洞察及研究
- 娱乐盛事策划全解析
- 月圆诗韵模板
- 建筑工地电梯方案设计
- 【监理公司】市政工程(道路及排水)质量评估报告范本(WORD档)
- 中国特色社会主义思想概论 课件 第四章 坚持以人民为中心
- 退役士兵求职简历模板+自荐书
- 控制阀培训课件
- 湘菜湖南美食文化介绍PPT
- 外科学外科休克PPT
- 三年级上册语文人教版《练习册》答案
- 浙人美2011版四年级美术上册《水资源》教案及教学反思
- 全桥LLC自动计算表格
- 魔芋怎么种?魔芋的种植技术
- GB/T 26766-2011城市公共交通调度车载信息终端
评论
0/150
提交评论