久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

perl and LWP 文檔

 weicat 2007-02-02

LWP( Library for Web access in Perl)
能做到什么,?
1. 使用URL對(duì)遠(yuǎn)程Web Server讀取文件,。
2. 對(duì)Web Serve利用POST 方式送出form request,。
3. 對(duì)遠(yuǎn)程Webserver最近更新的文件作更新動(dòng)作,。
4. 解析HTML 文件,,取得其中的「連結(jié)」與一些需要的數(shù)據(jù),。
5. 將HTML轉(zhuǎn)成純文本文件或Postscript檔案。
6. 處理cookies,HTTP redirects, proxy servers, and HTTP user authentication.這些特殊事件,。

重要特性:
1.包含許多可重復(fù)使用的組件,,可獨(dú)立運(yùn)作或相互配合使用.
提供一個(gè)HTTP-style溝通的Object Oriented模型,。支援 http, https, gopher, ftp, news, file, and mailto resources.
2.提供完整的OO接口,。
3.支持基本的編碼與認(rèn)證功能
4.支持重新導(dǎo)向處理。
5.可以透過代理服務(wù)器(Proxy server)
6.可以透過robots.txt建構(gòu)robots,。有點(diǎn)類似網(wǎng)絡(luò)上的爬蟲程序,。
7.實(shí)作HTTP的content negotiation algorithm 可以與CGI程序作界接。
8.支援 HTTP cookies.
8.有一個(gè)簡(jiǎn)單的指令格式應(yīng)用程序: lwp-request.

安裝時(shí),,要求先要安裝的modules:
URI URL parsing and manipulation
Net::FTP to support ftp:// URLs
MIME::Base64 to support HTTP Basic authentication
Digest::MD5 to support HTTP Digest authentication
HTML::HeadParser for finding the <BASE> tag in HTML headers
(實(shí)際上更多,,因?yàn)橐惭b上述module可能還要先安裝其它modules)

#--比較建議這種方式安裝,但是如果不能對(duì)外連結(jié),,只好跟我一樣慢慢抓modules,,一個(gè)一個(gè)安裝
用CPAN方法安裝:
#perl -MCPAN -e ‘install Bundle::LWP‘

除了上面的模塊外,另外還要安裝
#perl -MCPAN -e ‘install HTML::Parser‘ -e ‘install HTML::Formatter‘

如果不用CPAN方式安裝:
HTML-Parser HTML Parser
HTML-Tree HTML syntax-tree generation
Font-AFM Postscript font metrics
HTML-Format HTML Formatting
一定要要下載并安裝上述modules..

如果要使用HTTPS必須要安裝IO ::Socket ::SSL and OpenSSL library(http://www.)

安裝完LWP后,,會(huì)幫你安裝四個(gè)scripts
lwp-request 取得url并顯示出來
lwp-download 下載文件到硬盤,,適合大檔案使用。
lwp-mirror 與遠(yuǎn)程的服務(wù)器的文件作鏡射動(dòng)作,,只更新最近有被改變的文件,。
Lwp-rget 遞回的取得整個(gè)檔案架構(gòu)

LWP基礎(chǔ)程序:
#!/usr/bin/perl
# file get_url.pl
#--開啟語法檢查并使用LWP modules
use strict;
use LWP;
#--取得URL
my $url = shift;
#--建立LWP ::UserAgent 與HTTP ::Request 物件,
#--其中Request對(duì)象將$url傳進(jìn)去
my $agent=LWP::UserAgent->new();
my $request = HTTP::Request->new(GET=>$url);
#--透過UserAgent的request method將Request送出
my $response= $agent->request($request);
#--檢查是否有error發(fā)生
$response->is_success or die "$url: ",$response->message,"\n";
#--顯示responser的內(nèi)容
print $response->content;

其中HTTP ::Request Object可以很簡(jiǎn)單的只有一個(gè)URL也可以很復(fù)雜的包含cookies,、authentication information與CGI script所需要的arguments,。
HTTP ::Response對(duì)象,主要將Server回傳的結(jié)果打包起來,,其包含執(zhí)行結(jié)果狀態(tài)的信息加上文件內(nèi)容,。
LWP ::UserAgent 為一個(gè)介于Client與Server中間的媒介,負(fù)責(zé)傳送Request至Server,,并將Server的回傳值解析后存入HTTP ::Response Object中,。

另外也可以使用LWP ::Simple的Modules也可以作相同的事情。
# !/usr/bin/perl
# file simple_get.pl
use LWP ::Simple ;
my $url = shift;
#--如果正常會(huì)顯示內(nèi)容,,否則
getprint($url);


LWP中最重要的三個(gè)對(duì)象:HTTP::Request,、HTTP::Response、LWP::UserAgent,。
以下分別針對(duì)這三個(gè)modules作說明,。

LWP Modules里面Modules間的概觀:
LWP::MemberMixin -- Access to member variables of Perl5 classes
LWP::UserAgent -- WWW user agent class
LWP::RobotUA -- When developing a robot applications
LWP::Protocol -- Interface to various protocol schemes
LWP::Protocol::http -- http:// access
LWP::Protocol::file -- file:// access
LWP::Protocol::ftp -- ftp:// access
...

LWP::Authen::Basic -- Handle 401 and 407 responses
LWP::Authen::Digest

HTTP::Headers -- MIME/RFC822 style header (used by HTTP::Message)
HTTP::Message -- HTTP style message
HTTP::Request -- HTTP request
HTTP::Response -- HTTP response
HTTP::Daemon -- A HTTP server class

WWW::RobotRules -- Parse robots.txt files
WWW::RobotRules::AnyDBM_File -- Persistent RobotRules

Net::HTTP -- Low level HTTP client


在Web 服務(wù)的典型中,所有Client與Server的交互作用分為Client的request與Server的reponse

HTTP::Request:
Client的request包含URL與所使用的method。事實(shí)上HTTP::Rquset使用的是URI(Uniform Resource Identifier)包含了通訊協(xié)議與連結(jié)的服務(wù)器,。
通訊協(xié)議:
HTTP(http://www.abc:port/path/),、FTP(ftp://ftpname:port/path)、GOPHER(gopher:://gophername:port/path),、SMTP(mailto:user@mailserver),、NEWS(news:message-id)

這個(gè)modules支持的方法:
GET 取得URL的文件(web page)
PUT 替代或建立URL上的文件(ftp)
POST 送出事先準(zhǔn)備好的Form至Server處。
DELETE 刪除URL上的文件(FTP Server)
HEAD 取得URL的信息

HTTP協(xié)議包含其它信息:(RFC 822-like 字段)這里只有部分:
Accept 指出client準(zhǔn)備送出的MIME型態(tài)
User-agent Client軟件的名稱與版本
Content-type Request的文件型態(tài)

PUT與POST method:Request可以包含文件內(nèi)容(content data),。
PUT:包含要上傳的到URL的文件內(nèi)容,。
POST:包含已經(jīng)填好的要送出至CGI Script的Form。

LWP使用HTTP::Request表示所有經(jīng)由LWP所發(fā)送出去的的Request,,不是只有HTTP也可以包含F(xiàn)TP,、NNTP、SMTP等協(xié)議,。

Method的說明:
$request=HTTP::Request->new($method,$url[,$header[,$content]])
建構(gòu)HTTP::Request物件,。最少要兩個(gè)自變量($method與$url)。$URL可以是URI對(duì)象,。Header與content可以對(duì)象建立后再補(bǔ)數(shù)據(jù),。
$request->header($field1=>$val1,$feild2=>$val2..) 設(shè)定$field數(shù)值。
@values=$request->header($field):取得某個(gè)field里面的所有數(shù)值,??梢允莑ist也可以是scalar variable用","分隔的Variable。
$request->push_header($filed=>$value)
將$field與$value加入在header最后面
$request->remove_header(@fields)
刪掉特定的fields
$request->scan(\?)
對(duì)每個(gè)HTTP header作迭代每個(gè)element都丟入? function中,,主要傳入field數(shù)值與value數(shù)值,。
從HTTP::Header modules中繼承來的method..
$request->date():設(shè)定時(shí)間
$request->expires():設(shè)定過期時(shí)間
$request->last_modified():設(shè)定resources最后修改時(shí)間
$request->if_modified_since():檢查是否從$date后有被修正過。
$request->content_type():設(shè)定訊息內(nèi)容的形式
$request->content_length():設(shè)定訊息的長(zhǎng)度
$request->referrer():設(shè)定Used to specify the address (URI) of the document from which the requested resouce address was obtained.
$request->user_agent():Client端的軟件與版本
$request->content([$content])
設(shè)定requset的內(nèi)容,,可以是一個(gè)subroutine,,LWP會(huì)不斷invoke這個(gè)function直到回傳null數(shù)值。
$request->content_ref
回傳ref to content,,可以直接修改內(nèi)容
$requese->add_content($data)
增加content內(nèi)容
改變URL內(nèi)容與method:
$request->uri([$uri])
設(shè)定或取出URI內(nèi)容
$request->method([$method])
設(shè)定或取出method內(nèi)容
$string=$request->as_string
將request內(nèi)容以文字方式顯示出來

一些例子:
發(fā)送Email:
$req = HTTP::Request->new(POST => ‘mailto:[email protected]‘);
$req->header(Subject => "subscribe");
$req->content("Please subscribe me to the libwww-perl mailing list!\n");

FTP檔案:
$req = HTTP::Request->new(GET => ‘file:/etc/passwd‘);

與NEWS Server作用:
$req = HTTP::Request->new(GET => ‘news:[email protected]‘);

$req = HTTP::Request->new(POST => ‘news:comp.lang.perl.test‘);
$req->header(Subject => ‘This is a test‘,
From => ‘[email protected]‘);
$req->content(<<EOT);
This is the content of the message that we are sending to
the world.
EOT

CPAN Request:
$LWP::Protocol::cpan::CPAN = "file:/local/CPAN/";

HTTP::Response物件:
HTTP::Reponse接收服務(wù)器的回應(yīng)值,,沒有限定一定要是HTTP協(xié)議。
回傳的狀態(tài)碼,,不管是不是HTTP都回傳下列數(shù)值:
100-199 狀態(tài)碼從100到199,,為要求完成前的狀態(tài)碼
200-299 成功
300-399 重新轉(zhuǎn)向,URL已經(jīng)被移動(dòng)至其它地方,。
400-499 Client-side 錯(cuò)誤
500以上 Server-side 錯(cuò)誤

如果Server回傳301 或 302,,則LWP會(huì)對(duì)新的URL發(fā)出要求,所以回傳值,,是針對(duì)新的URL并非針對(duì)舊的URL,。
如果Server回傳401需要Authorization,,而且Authorization信息也存在,則LWP會(huì)重新發(fā)送存在Authorization的Request到Server端,。

HTTP::Response有一個(gè)建構(gòu)子(contructor),,但是因?yàn)椴粫?huì)去呼叫他,所以以下并沒有列出建構(gòu)子,。
$status_code = $response->code
$status_message=$response->message
code()回傳狀態(tài)碼,,message()回傳訊息明碼內(nèi)容,也可以給他參數(shù)設(shè)定他的數(shù)值,。
$text=$response->status_line
回傳與Web Server傳回的內(nèi)容一樣的數(shù)值,,狀態(tài)碼加上訊息內(nèi)容。
$boolean=$response->is_success
是否成功
$boolean=$response->is_redirect
是否重新轉(zhuǎn)向
$boolean=$response->is_info
是否是information
$boolean=$response->is_error
是否有錯(cuò)誤
$html=$response->error_as_HTML
當(dāng)is_error為真的時(shí)候,,利用error_as_HTML產(chǎn)成HTML格式的錯(cuò)誤訊系
$base=$response->base
回傳base的URL,。實(shí)際上回傳URI對(duì)象,,可用來解析relative的links,。
$request=$response->request
回傳HTTP::Request 物件。如果有redirect或authentication則對(duì)象內(nèi)容會(huì)與原本的不一樣,。
$request=$reponse->previous
回傳HTTP::Request對(duì)象,,可以在一連串redirect之后找到原始的HTTP::Request對(duì)象內(nèi)容。

下面是一個(gè)找出所有轉(zhuǎn)向過程的Script:
#!/usr/bin/perl
#file follow_chain.pl

use strict;
use LWP;

my $url = shift;
my $agent = LWP::UserAgent->new();
my $request=HTTP::Request->new(HEAD=>$url);

my $response=$agent->request($request);
$response->is_success or die "$url: ", $response->message,"\n";
my @urls;
for(my $r = $response; defined $r; $r=$r->previous){
unshift @urls,$r->request->uri.‘(‘.$r->status_line.‘)‘;
}
print "Response chain:\n \t",join("\n\t-> ",@urls),"\n";


LWP ::UserAgent物件:
LWP ::UserAgent的角色在于傳送request至遠(yuǎn)程的Server,,接收Server回傳值并將之放入HTTP ::Response物件中,。其實(shí)可以把他當(dāng)成是一個(gè)Web Browser engine。
跟一般的Web browser一樣,,LWP ::UserAgent可以知道對(duì)方的Document是否有更新,、儲(chǔ)存Cookies、與相對(duì)應(yīng)的authentication并可以透過http Proxy與其它Server相通,。
UserAgent通常會(huì)被其它Class繼承,,以適應(yīng)不同的遠(yuǎn)程Server內(nèi)容。

$agent=LWP ::UserAgent->new
建立LWP ::UserAgent物件
$response=$agent->request($request,[$dest[,$size]])
產(chǎn)生Request,,并將結(jié)果存入$response中,。透過$response->code與$response->is_success()可以知道是否有成功。
$dest為一個(gè)filename,,所取得的文件會(huì)存在這個(gè)地方,,$response只存是否成功沒有內(nèi)容;如果沒給,,會(huì)回傳至$response,。
也可以是callback subroutine,
$response=$agent->request($request,\&handle_content);
sub handle_content{
my ($data,$response,$protocol) = @_;

}
$data :current chunk of data
$response: HTTP::Response 物件
$protocol: LWP::Protocol 物件

當(dāng)使用ref to code的時(shí)候,,可以利用$size控制chunk的大小,。例如128,,則callback subtine每次會(huì)讀取128 bytes chunks of the content data.

兩個(gè)request的變形:
$response=$agent->simple_request($request,[$dest,[$size]])
很像request,但是碰到redirect與authentication的時(shí)候不會(huì)再次產(chǎn)生新的request,。
$response=$agent->mirror($url,$file)
接受一個(gè)URL與本地儲(chǔ)存文件的路徑,,假如本地文件較舊,則將遠(yuǎn)程文件抓取回來,。

設(shè)定Request的時(shí)間與空間限制
$timeout = $agent->timeout([$timeout])
設(shè)定或讀取timeout時(shí)間,,default 180秒。
$bytes = $agent->max_size([$bytes])
設(shè)定或讀取遠(yuǎn)程Server所能回傳的最大空間,。Default undef,,可以不受限制收取content

增加$request的信息
$id=$agent->agent([$id])
設(shè)定或取出User-Agent:字段。內(nèi)容像name/x.xx,,name是Client software名稱,。x.xx是版本。Default : lwpwww-perl/x.xx,??梢则_remote Server
$agent->agent(‘Mozilla/4.7 [en] (PalmOS)‘) [在Palm上執(zhí)行 Mozilla]
$address=$agent->from([$address])
設(shè)定或取出負(fù)責(zé)這個(gè)User-Agent的E-mail address,再使用mail或news的時(shí)候會(huì)填入From: 字段,。對(duì)HTTP Server的時(shí)候不使用這個(gè),。

與Proxy作用的methods
$proxy=$agent->proxy($protocol=>$proxy);
設(shè)定或取出proxy server用的protocol與URL。
$protocol可以是一個(gè)純量(‘ftp‘)也可以是一個(gè)ref to list([‘ftp‘,‘http‘,‘gopher‘]),。
$proxy是proxy server用的URL,。例如:
$agent->proxy([qw(ftp http)] => ‘http://proxy.e:8080‘)
可以再呼叫以修改proxy server的protocol
$agent->proxy(ftp => ‘http://proxy_1.aaa,bbb:8080‘);
$agent->proxy(http=>‘http://proxy_2.aaa.bbb:8081‘);
$agent->no_proxy(@domain_list)
設(shè)定對(duì)某些domain不用proxy server。
$agent->no_proxy(‘localhost‘,‘a(chǎn)aa.bbb‘);
$agent->no_proxy():清除所有先前設(shè)定的domains
$agent->env_proxy
另外一種設(shè)定proxy的方法,。讀取ENV變數(shù)(*_proxy),。
Setenv ftp_proxy http://aaa.c:8080
Setenv http_proxy http://aaa.c:8080
Setenv no_proxy localhost,c

控制Authentication與Cookies
($name,$pass) = $agent->get_basic_credentials($realm,$url,[$proxy])
當(dāng)proxy server需要認(rèn)證時(shí),LWP會(huì)呼叫這個(gè)subroutine,,取得username與

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多