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

分享

Perl 之LWP 與 WEB 的基本使用

 weicat 2007-02-02








譯者/作者:qiang
出處:中國(guó)Perl協(xié)會(huì) FPC(Foundation of Perlchina)
作者:Sean M. Burke – Perl & LWP 作者(O’Reilly 出版)
原名:Web Basics with LWP
發(fā)表:2002 年 2月 28 日
原文:http://www./pub/a/2002/08/20/perlandlwp.html
請(qǐng)保護(hù)作者的著作權(quán),維護(hù)作者勞動(dòng)的結(jié)晶。 得分:134分

LWP 與 WEB 的基本使用

簡(jiǎn)介

LWP (“Library for WWW in Perl” 的縮寫(xiě)) 是一個(gè)由多個(gè)模塊組成,,用來(lái)獲取網(wǎng)絡(luò)數(shù)據(jù)的的模塊組,。 和很多 Perl 的模塊一樣。每一個(gè) LWP 模塊都自帶詳細(xì)的文檔,,做為對(duì)這個(gè)模塊的完整介紹,。可是面對(duì) LWP 里的眾多模塊,,有時(shí)候即使是完成最簡(jiǎn)單的工作,,新手們也常常不知道從那里開(kāi)始。

要對(duì) LWP 做全面的介紹需要一整本書(shū),很幸運(yùn),,Perl & LWP 已經(jīng)出版,。而這篇文章向你介紹了最常見(jiàn)的 LWP 用法。

使用 LWP::Simple 獲取網(wǎng)頁(yè)

如果只是要拿到某個(gè)網(wǎng)頁(yè),,那使用 LWP::Simple 里的函數(shù)是最簡(jiǎn)單的,。

通過(guò)調(diào)用 get($url) 函數(shù),就可以得到相關(guān)網(wǎng)址的內(nèi)容,。如果沒(méi)有發(fā)生錯(cuò)誤,,get 函數(shù)返回此網(wǎng)頁(yè),否則,,返回 undef,。例子如下:

  my $url = ‘http://freshair./dayFA.cfm?todayDate=current‘

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

# $content 里是網(wǎng)頁(yè)內(nèi)容,下面是對(duì)此內(nèi)容作些分析:

if($content =~ m/jazz/i) {
print "They‘re talking about jazz today on Fresh Air!\n";
} else {
print "Fresh Air is apparently jazzless today.\n";
}
如果要在命令行里運(yùn)行,,getprint 函數(shù)非常方便,。如果沒(méi)有發(fā)生錯(cuò)誤,它會(huì)把網(wǎng)頁(yè)內(nèi)容輸出到 STDOUT,,否則將會(huì)有錯(cuò)誤信息輸出到 STDERR,。 例如:
   % perl -MLWP::Simple -e "getprint ‘http:///RECENT‘"
上面的網(wǎng)址指向一個(gè)文本文件,列有最近兩個(gè)星期內(nèi) CPAN 更新過(guò)的文件,。如果想要知道 Acme:: 的模塊是否有更新,,有就email 自己,你可以把它和 Shell 結(jié)合到一起來(lái)實(shí)現(xiàn),。如下:
  % perl -MLWP::Simple -e "getprint ‘http:///RECENT‘"  \
| grep "/by-module/Acme" | mail -s "New Acme modules! Joy!" $USER
LWP::Simple 還有一些非常有用的函數(shù),,包括一個(gè)運(yùn)行HEAD請(qǐng)求的函數(shù),用來(lái)檢查鏈接是否有效,,網(wǎng)頁(yè)是否更新,。另外兩個(gè)用來(lái)保存和鏡像網(wǎng)址的函數(shù)也值得一提。具體請(qǐng)看 LWP::Simple 的文檔或 Perl & LWP 的第二章.

LWP Class 模型基礎(chǔ)

LWP::Simple 在做簡(jiǎn)單的工作時(shí)很方便,。但因?yàn)椴恢С?cookies,,用戶認(rèn)證,對(duì) HTTP request header (請(qǐng)求標(biāo)頭)的編輯,,和 HTTP resonse header(響應(yīng)標(biāo)頭)的讀寫(xiě)(主要是 HTTP 的 error message),。因此,當(dāng)需要這些特性的時(shí)候,,就要使用 LWP Class 模型,。

在眾多的 LWP Class 里,LWP::UserAgent 和 HTTP::Response 是必須理解的,。LWP::UserAgent 就像一個(gè)虛擬瀏覽器用來(lái)作 request (請(qǐng)求),。HTTP::Response 用來(lái)儲(chǔ)存 request (請(qǐng)求) 生成的 response(響應(yīng)),。

最基本的用法是 $response = $browser->get($url), 或?qū)懙母暾?:

  # 程序開(kāi)始:

use LWP 5.64; # 載入較新版本的 LWP classes

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

...

# get request:
my $url = ‘http://freshair./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

# 成功的話就對(duì)內(nèi)容處理

if($response->content =~ m/jazz/i) {
print "Fresh Air 今天在討論爵士樂(lè)!\n";
} else {
print "Fresh Air 今天討論的和爵士樂(lè)一點(diǎn)邊都不沾.\n";
}
上面有兩個(gè)相關(guān)的 object: $browser,是 LWP::UserAgent 的一個(gè)object,。$response 是屬于 HTTP::Response 類的一個(gè)object,。一個(gè)程序里只需要一個(gè) $browser object,,但是每次發(fā)出一個(gè) request,,就會(huì)得到一個(gè)新的 HTTP::Response object。

HTTP::Response object 有以下一些有價(jià)值的屬性:

  • 一個(gè) status code(狀態(tài)代碼值),,表示成功或失敗,。你可以使用 $response->is_success 來(lái)檢測(cè)它。
  • http status line(http 狀態(tài)描述),,觀察 $response->status_line 的結(jié)果 ( 比如 “404 Not Found” ) 會(huì)幫助你理解這個(gè)詞的意思,。
  • MIME content-type(文件類型)通過(guò) $response->content_type 來(lái)獲得。例如 “text/html”,,”image/gif”,,”application/xml” 等等。
  • content of the response(響應(yīng)返回的內(nèi)容)儲(chǔ)存在 $response->content,。內(nèi)容可能是 html 格式,。如果是 GIF 格式,$response->content 里是二進(jìn)制的 GIF 數(shù)據(jù),。
  • 許多其他 methods 都可以在 HTTP::Response 和它的 superclasses (父 class) HTTP::Message 和 HTTP::Headers 里找到,。

添加其他 HTTP 請(qǐng)求 headers

request (請(qǐng)求) 常用的方法是 $response = $browser->get($url),但如果需要,,你可以在 $url 后跟一個(gè)鍵值的列表來(lái)給你的 request 加上其他 HTTP headers,。象這樣 :
   $response = $browser->get( $url, $key1, $value1, $key2, $value2, ... );
舉個(gè)例子,如果你要對(duì)一個(gè)只允許 Netscape 瀏覽器連入的網(wǎng)站發(fā)出請(qǐng)求,,那就需要發(fā)出類似 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);
如果不打算重復(fù)使用這個(gè) array,你可以把它寫(xiě)到 get 函數(shù)里
  $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,,可以通過(guò) LWP::UserAgent 的 agent 方法把缺省的agent ‘libwww-perl/5.65’(或者別的)改掉,。
   $browser->agent(‘Mozilla/4.76 [en] (Win98; U)‘);

使用 cookies

默認(rèn)的LWP::UserAgent對(duì)象像一個(gè)不支持cookies的瀏覽器一樣工作。有不只一種的辦法可以設(shè)定它的cookie_jar屬性,,從而讓它支持cookies,。“cookie jar” 是一個(gè)用來(lái)儲(chǔ)存 HTTP cookie 的容器,。你可以把它存到硬盤(pán)(像Netscape使用cookies.txt一樣)或內(nèi)存里,。存到內(nèi)存里的 cookies 會(huì)在程序完成后消失。

內(nèi)存式的 cookie 使用方法:

   $browser->cookie_jar({});
也可以把 cookie 儲(chǔ)存到硬盤(pán)的文件里:
 use HTTP::Cookies;
$browser->cookie_jar( HTTP::Cookies->new(
‘file‘ => ‘/some/where/cookies.lwp‘,
# 儲(chǔ)存 cookies 的地址
‘a(chǎn)utosave‘ => 1,
# 當(dāng)完成后自動(dòng)儲(chǔ)存到硬盤(pán)里
));
文件里的 cookie 是以 LWP 自定的格式儲(chǔ)存,,如果你想在 netscape 里使用這個(gè) 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
));
你也可以象上面一樣使用 ‘a(chǎn)utosave’ => 1 ,。 但 Netscape 的 cookie 有時(shí)會(huì)在寫(xiě)入硬盤(pán)之前就被丟掉,至少在寫(xiě)這篇文章的時(shí)候還是這樣,。

通過(guò) POST提交表格

大部分HTML表格使用HTML POST 向服務(wù)器提交數(shù)據(jù),,在這里你可以這樣:
 $response = $browser->post( $url,
[
formkey1 => value1,
formkey2 => value2,
...
],
);
或者你也可以把 HTTP header 也一起發(fā)出
 $response = $browser->post( $url,
[
formkey1 => value1,
formkey2 => value2,
...
],
headerkey1 => value1,
headerkey2 => value2,
);
下一個(gè)例子向 AltaVista 的搜索引擎發(fā)送 HTTP POST 請(qǐng)求,然后從HTML里提取出符合匹配的總數(shù),。
  use strict;
use warnings;
use LWP 5.64;
my $browser = LWP::UserAgent->new;

my $word = ‘tarragon‘;

my $url = ‘http://www./sites/search/web‘;
my $response = $browser->post( $url,
[ ‘q‘ => $word, # the Altavista query string
‘pg‘ => ‘q‘, ‘a(chǎn)vkw‘ => ‘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" 里匹配出結(jié)果
print "$word: $1\n";
} else {
print "Couldn‘t find the match-string in the response\n";
}

通過(guò) GET 提交表格

一些HTML表格不使用 POST 請(qǐng)求,,而是使用 GET 請(qǐng)求來(lái)傳輸數(shù)據(jù)。例如,,在 里檢索電影名字 ‘Blade Runner’, 提交后在瀏覽器的網(wǎng)址欄里將顯示 :
  http://us./Tsearch?title=Blade%20Runner&restrict=Movies+and+TV
下面是使用 LWP 實(shí)現(xiàn)同樣的結(jié)果 :
  use URI;
my $url = URI->new( ‘http://us./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章詳細(xì)描述了 HTML 表格和表格數(shù)據(jù),,第6章到第9章描述了怎樣從獲得的HTML數(shù)據(jù)里提取出有用的信息。

URL 處理

上面提到的 URI class 提供很多獲取和修改 URL 的方法,。例如 如果想要知道 url 是什么類型 (http, ftp 等等) 可以使用 $url->schema 來(lái)得到,,如果要提取網(wǎng)址里的主機(jī)名,可以使用 $url->host,。不過(guò),,可能最有用的是我前面提到的 query_form 方法,以及把相對(duì)網(wǎng)址路徑(如”../foo.html”)轉(zhuǎn)換成絕對(duì)路徑(如”http: //www./stuff/foo.html”)的 new_abs 方法,。例子如下:
  use URI;
$abs = URI->new_abs($maybe_relative, $base);
現(xiàn)在回憶一下獲取最新 CPAN 模塊的那個(gè)例子,。
  use strict;
use warnings;
use LWP 5.64;
my $browser = LWP::UserAgent->new;

my $url = ‘http://www./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/chunk86920392chunklt;A HREF=\"(.*?)\"/g ) {
print "$1\n";
}
輸出的結(jié)果是
  MIRRORING.FROM
RECENT
RECENT.html
authors/00whois.html
authors/01mailrc.txt.gz
authors/id/A/AA/AASSAD/CHECKSUMS
...
你可以使用 URI 模塊的 new_abs 方法來(lái)得到完全網(wǎng)址路徑,修改 while 循環(huán):
  while( $html =~ m/<A HREF=\"(.*?)\"/g ) {    
print URI->new_abs( $1, $response->base ) ,"\n";
}
$response->base 方法可以在 HTTP::Message 里找到,。它返回的 URL 通常被用來(lái)和相對(duì)路徑合并來(lái)得到完全路徑?,F(xiàn)在得到的結(jié)果是
  http://www./MIRRORING.FROM
http://www./RECENT
http://www./RECENT.html
http://www./authors/00whois.html
http://www./authors/01mailrc.txt.gz
http://www./authors/id/A/AA/AASSAD/CHECKSUMS
...
請(qǐng)參考 Perl & LWP 的第四章,以得到對(duì) URI objects 更詳細(xì)的描述,。

當(dāng)然,,使用 regexp (正則表達(dá)式) 來(lái)匹配 url 相對(duì)簡(jiǎn)單,如果情況復(fù)雜,需要更強(qiáng)大的匹配工具,,可以考慮 HTML 分析模塊 HTML::LinkExtor 或 HTML::TokeParser,,甚至 HTML::TreeBuilder

其他瀏覽器屬性

LWP::UserAgent objects 有幾個(gè)值得注意的屬性 :
  • $browser->timeout(15): 設(shè)定缺省 request 的 timeout 時(shí)間.超過(guò)這個(gè)時(shí)間就放棄請(qǐng)求。
  • $browser->protocols_allowed( [ ‘http’, ‘gopher’] ): 這用來(lái)設(shè)定只接受 http 和 gopher 協(xié)議,。連接其他協(xié)議時(shí)就返回 500 錯(cuò)誤值,,”Access to ftp URIs has been disabled” 的錯(cuò)誤消息。
  • use LWP::ConnCache; $browser->conn_cache(LWP::ConnCache->new()): 這告訴 browser object 使用 HTTP/1.1 “keep-Alive” 特性,,即重復(fù)使用先前的 socket 來(lái)加快請(qǐng)求速度,。
  • $browser->agent( ‘SomeName/1.23 (more info here maybe)’ ): 設(shè)置 HTTP 請(qǐng)求的 User-Agent。LWP 缺省使用 “l(fā)ibwww-perl/versionnumber” 作為 User-Agent,,比如 “l(fā)ibwww-perl/5.65”,。你可以加上更多的信息:
          $browser->agent( ‘SomeName/3.14 ([email protected])’ );
    或者可以偽裝為
          $browser->agent( ‘Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC)’ );
  • push @{ $ua->requests_redirectable }, ‘POST’: 告訴 LWP 在 POST 請(qǐng)求發(fā)送后如果發(fā)生重新定向就自動(dòng)跟隨 ( 雖然 RFC 里不要求這么做 )
詳細(xì)請(qǐng)參見(jiàn) LWP::UserAgent 文檔.

寫(xiě)一個(gè)有禮貌的機(jī)器人

如果想遵循 robots.txt 和避免在較短的時(shí)間發(fā)出太多的請(qǐng)求,你可以采用 LWP::RobotUA 而不是 LWP::UserAgent,。

LWP::RobotUA 用法與 LWP::UserAgent 一樣:

  use LWP::RobotUA;
my $browser = LWP::RobotUA->new(
‘YourSuperBot/1.34‘, ‘[email protected]‘);
# 機(jī)器人名字和 email 地址

my $response = $browser->get($url);
HTTP::RobotUA 多了幾個(gè)特性:
  • 如果 $url 請(qǐng)求的服務(wù)器的 robots.txt 禁止了你對(duì) $url的訪問(wèn),,那么 $browser 就不會(huì)發(fā)出對(duì)于這個(gè)地址的請(qǐng)求,,而是返回 403 代碼和一個(gè)錯(cuò)誤信息 “Forbidden by robots.txt”。
        die "$url -- ", $response->status_line, "\nAborted" 
    unless $response->is_success;
    然后你會(huì)得到這樣的錯(cuò)誤信息:
          http://whatever./pith/x.html -- 403 Forbidden 
    by robots.txt
    Aborted at whateverprogram.pl line 1234
  • 如果 $browser 發(fā)現(xiàn)請(qǐng)求的地址是剛剛請(qǐng)求過(guò)的,,就會(huì)暫停 (sleep) 來(lái)避免發(fā)送太多的請(qǐng)求,。缺省暫停 1 分鐘,但可以通過(guò) $browser->delay( minutes ) 來(lái)設(shè)定,。比如:
         $browser->delay( 7/60 );
詳細(xì)請(qǐng)參見(jiàn) LWP::RobotUA文檔.

使用代理

有時(shí)你希望(或者是必須)通過(guò)代理來(lái)連接某些站點(diǎn)或協(xié)議,,就比如你的LWP程序是運(yùn)行在某臺(tái)處于防火墻之內(nèi)的機(jī)器上。

代理通常儲(chǔ)存在環(huán)境變量 HTTP_PROXY 里,。LWP 可以通過(guò) user-agent object 里的 env_proxy 函數(shù)把環(huán)境變量里的代理地址裝載,。

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

# And before you go making any requests:
$browser->env_proxy;
詳細(xì)請(qǐng)參照 LWP::UserAgent 文檔里的 proxy, env_proxy 和 no_proxy 方法.

HTTP 認(rèn)證

許多網(wǎng)站都是通過(guò) HTTP 認(rèn)證來(lái)限制連接. 當(dāng)用戶請(qǐng)求一個(gè)限制頁(yè)面時(shí), HTTP 服務(wù)器回復(fù) “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”. ( 你現(xiàn)在請(qǐng)求了一個(gè)限制區(qū)域 , 如果你需要重新發(fā)送一個(gè)帶有認(rèn)證信息的 header 才可以連入. )

Unicode.org 的管理員為了防止機(jī)器人訪問(wèn)郵件組獲取發(fā)信人地址,,要求先進(jìn)行 HTTP 認(rèn)證,。用戶名和密碼是公開(kāi)的:用戶名: unicode-ml 密碼: unicode

假設(shè)一個(gè)限制頁(yè)面的地址是

  http://www./mail-arch/unicode-ml/y2002-m08/0067.html
如果你在瀏覽器里請(qǐng)求這個(gè)地址,一個(gè)新的窗口跳出,,顯示 “Enter username and password for ‘Unicode-MailList-Archives’ at server ‘www.’”,。請(qǐng)你輸入用戶名和密碼,就像這樣:

單純使用 LWP 請(qǐng)求這個(gè)網(wǎng)址 :

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

my $url =
‘http://www./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 $url\n Aborting"
unless $response->is_success;
你將得到以下錯(cuò)誤:
   Error: Basic realm="Unicode-MailList-Archives" 
401 Authorization Required
at http://www./mail-arch/unicode-ml/y2002-m08/0067.html
Aborting at auth1.pl line 9. [or wherever]
這是因?yàn)?LWP 不知道 host www. 里的 “Unicode-MailList-Archives” 區(qū)的用戶名和地址,。解決這個(gè)問(wèn)題最簡(jiǎn)單的方法是使用 credentials 方法來(lái)提供用戶名和密碼:
   $browser->credentials(
‘servername:portnumber‘,
‘realm-name‘,
‘username‘ => ‘password‘
);
通常, 端口是 80. credentials 函數(shù)要在發(fā)請(qǐng)求之前調(diào)用.比如:
  $browser->credentials(
‘reports.mybazouki.com:80‘,
‘web_server_usage_reports‘,
‘plinky‘ => ‘banjo123‘
);
我們的 的例子可以寫(xiě)成
  $browser->credentials(  # add this to our $browser ‘s "key ring" 
‘www.:80‘,
‘Unicode-MailList-Archives‘,
‘unicode-ml‘ => ‘unicode‘
);

連接 HTTPs URLs

只要有安裝 LWP 的HTTPs 的支持, 訪問(wèn) 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 $url\n ", $response->status_line, "\n Aborting"
unless $response->is_success;

print "Whee, it worked! I got that ",
$response->content_type, " document!\n";
如果沒(méi)有 HTTPs 的支持, 如下錯(cuò)誤信息會(huì)顯示
   Error at https://www.paypal.com/
501 Protocol scheme ‘https‘ is not supported
Aborting at paypal.pl line 7. [or whatever program and line]
如果你安裝了 LWP 的 HTTPS 支持的話,,你的請(qǐng)求應(yīng)該是成功的,你可以像對(duì)待普通的 HTTP 請(qǐng)求一樣處理 $response 對(duì)象,。

關(guān)于安裝 HTTPS 支持的信息可以在libwww-perl 里的README.SSL 文件找到.

獲取大文件

請(qǐng)求較大的文件時(shí), 普通的請(qǐng)求方法 ( 例如 $response = $browser->get($url) ) 會(huì)給你帶來(lái)內(nèi)存問(wèn)題. 因?yàn)?$response 儲(chǔ)存著整個(gè)文件. 如果請(qǐng)求了一個(gè) 30MB 的文件, 那可能不是什么明智的做法.

一個(gè)解決方法是把文件存到硬盤(pán)

   $response = $ua->get($url,
‘:content_file‘ => $filespec,
);
比如:
  $response = $ua->get(‘http://search./‘,
‘:content_file‘ => ‘/tmp/sco.html‘
);
當(dāng)使用 content_file 時(shí), headers 還是在$response, 但$response->content 是空.

值得注意的是LWP 5.66 之前的版本不支持content_file . 你應(yīng)該使用 use LWP 5.66; 如果你的程序可能運(yùn)行在低版本的 LWP 上, 你也可以使用下面的例子來(lái)保證兼容性, 這與 content_file 有同樣效果.

  use HTTP::Request::Common;
$response = $ua->request( GET($url), $filespec );

資源

以上只是對(duì) LWP 常用函數(shù)的簡(jiǎn)介, 如果想了解更多關(guān)于 LWP 和 LWP 相關(guān)的東西, 請(qǐng)參閱以下文檔

 

  • LWP::Simple: 提供簡(jiǎn)易的 get, head, mirror 方法.
  • LWP: libwww-perl 模塊的綜述
  • HTTP::Response: 發(fā)出 LWP 請(qǐng)求后所得到的響應(yīng) , $response = $browser->get(...).
  • HTTP::Message and HTTP::Headers: HTTP::Response 很多方法都是來(lái)自兩者.
  • URI: Class 處理完全和相對(duì)網(wǎng)址路徑.
  • URI::Escape: 來(lái)正確處理和轉(zhuǎn)換 URL 里的不規(guī)則字符 (比如 “this & that” 和 “this%20%26%20that” 之間的轉(zhuǎn)換).
  • HTML::Entities: 來(lái)正確處理和轉(zhuǎn)換 HTML 里的不規(guī)則字符 (比如 “C. & E. Bront??” 和 “C. & E. Bront??” 之間的轉(zhuǎn)換).
  • HTML::TokeParser and HTML::TreeBuilder: Classes 分析 HTML
  • HTML::LinkExtor: Class :在 HTML 找到鏈接
  • 當(dāng)然還有我的 Perl & LWP.

與 Sean Burke 討論后的一些筆記

在翻譯這篇文章的時(shí)候,我聯(lián)系到了文章作者, Sean Burke. 他同意把原文章里需要補(bǔ)充和更新的地方指出. 我與作者也通過(guò) MSN 交流了一下. 這里我把自己對(duì) LWP 的理解和作者的補(bǔ)充寫(xiě)在這里.

 

  • 在文章里提到了使用
         use LWP::ConnCache;

    $browser->conn_cache(LWP::ConnCache->new()):
    這告訴 browser object 使用 HTTP/1.1 “keep-Alive” 特性, 即重復(fù)使用先前的 socket 來(lái)加快請(qǐng)求速度.

    你也可以在 new LWP::UserAgent 時(shí)為 $browser 加上 “keep-Alive” 特性, 如下

          use LWP;
    $browser = new LWP::UserAgent(keep_alive => 1);
  • 不要忘記 response object 的 header 通常有很多非常值得注意的信息, 你可以通過(guò) headers_as_string 和 as_string 函數(shù)來(lái)得到. 下面是使用 headers_as_string 返回的例子
         use LWP;
    my $br = LWP::UserAgent->new;
    my $resp = $br ->get(‘http://www.‘);
    print $resp->headers_as_string";
    輸出結(jié)果:
         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./Front_Page/page.asp
    X-Meta-Robots: noindex
    X-Powered-By: ASP.NET
    你也可以通過(guò) $response->header(‘field’) 來(lái)獲得想要的特別 header. 象上面的例子, 如果要訪問(wèn)的網(wǎng)頁(yè)使用了 meta refresh :
    	<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=http://www./Front_Page/page.asp">
    你可以使用 $response->header(‘refresh’) 來(lái)拿到 refresh 的 url 地址, 選擇是否繼續(xù)跟進(jìn).
  • 有些時(shí)候, 瀏覽器可以正常訪問(wèn)到的地址, LWP 卻不行. 一般是因?yàn)槟愕?LWP 的 header, referer , cookie 或 user-agent 等的設(shè)定與對(duì)方網(wǎng)絡(luò)服務(wù)器允許連入的不同. 為了找到問(wèn)題所在, 你需要比較瀏覽器發(fā)出的請(qǐng)求和你的 LWP 發(fā)出的請(qǐng)求有何不同, 然后修改再嘗試. 很多時(shí)候這是反反復(fù)復(fù)的工作. 我最早使用 Ethereal 來(lái)監(jiān)視,抓取數(shù)據(jù), 目前使用 Firefox 的 LiveHTTPHeaders 插件. 現(xiàn)在LWP 也自帶一個(gè)數(shù)據(jù)分析模塊 LWP::DebugFile 來(lái)幫助你找到問(wèn)題.
  • 另外, 文章里提到了 HTTP::Cookies::Netscape , 現(xiàn)在LWP Cookies 模塊支持更多瀏覽器 Mozilla , Safari , Omniweb
  • 很多時(shí)候表格與 javascript 一起使用, LWP 沒(méi)有分析 Javascript 的引擎,,所以你必須分析網(wǎng)頁(yè)源碼里 Javascript 來(lái)決定怎樣處理.
    function Submit()
    {
    .........
    self.document.location.href="verify.php";

    return false;
    }

    ........

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

    上面的這個(gè)例子通過(guò)表格提交來(lái)觸動(dòng) javascript 的 submit 函數(shù), 最后調(diào)用了 verify.php. 現(xiàn)在你就可以跳過(guò)所有的 javascript 而直接對(duì) verify.php 來(lái)提交.

    <input type=button value="Submit your page" onClick="javascript:Submit();return false;//">
    上面的這個(gè)例子通過(guò)表格提交來(lái)觸動(dòng) javascript 的 submit 函數(shù), 最后調(diào)用了 verify.php. 現(xiàn)在你就可以跳過(guò)所有的 javascript 而直接對(duì) verify.php 來(lái)提交.









    本站是提供個(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)論公約

    類似文章 更多