perl学习笔记16--Web自动化和连网
2010年06月13日
Web自动化和连网
1. LWP概述
?? HTTP:Request请求对象包含了一些用于描述客户对服务器的请求的信息。它所包含的属性有:method(方法)、URL(统一资源定位)、header(标头)和content(内容)。HTTP:Request有4种请求方法:get、put、post和head。URL时所请求的URL地址。标头是一组健/值对,它提供了关于请求的附加信息。内容包含了作为请求的一部分、由客户发给服务器的数据。
?? 当服务器收到请求后,他会建立一个用于响应客户的HTTP:Response对象。HTTP:Response对象有4种属性:响应码(code)、响应消息(message)、标头(headers)和内容(content)。响应码是请求结果的状态指示器。它表明请求成功或者发生了错误。响应消息是与响应码对应的字串信息。标头包含了关于响应的附加信息,提供了用户所使用的、用来决定如何处理响应内容的描述。内容是有关响应的一些数据。
?? 通过一个称为用户代理(User Agent)的对象来完成把请求对象转变成响应对象的。在Perl中,该用户代理是类LWP:UserAgent的一个实例。在一般的Web交互中,他的作用相当于一个浏览器,他处理来自请求的信息,并创建相应的响应对象。响应对象定义了要返回给用户代理(一般是一个Web浏览器)的响应信息。用户代理主要属性有:延时(timeout)、代理名城(agent)、用户邮件地址(from)和认证书(credentials)。延时定义了用户代理在超时发生前的最长等待时间。代理名称定义了所使用的用户代理的名字。当用户代理与网络进行会话时,就会用到这个名字。用户邮件地址也就是正在使用web浏览器的用户的邮件地址。认证书包含了一次成功响应所需要的用户名或密码。
2. LWP命令
?? 用户代理的request方法用于请求定义的文档。该方法调用的结果储存在一个HTTP::Response对象中。
my $agent = new LWP::UserAgent();
my $request = new HTTP::Request ( 'GET' = $url );
my $response = $agent -> request ( $request );
?? HTTP::Response对象的is_success方法用来判别请求是否成功。如果请求成功,就调用HTTP::Response对象的content方法,输出响应。如果请求不成功,就调用HTTP::Response对象的status_line方法,输出错误信息。这个方法将从对象中返回状态代码和响应消息。
if ( $response -> is_success () ) {
print ( OUT $response -> content () );
}
Else {
print ( OUT "Error:" . $response -> status_line() . " \n");
}
?? 在HTTP::Request对象中的POST请求方法类似于HTML单元素中post方法。
$request = new HTTP::Request ( 'POST', $url );
?? HTTP:Request对象中的content_type方法用于设置请求的内容类型(content type)。这决定了HTTP协议如何处理这个请求。
$request -> content_type ( ' application/x-www-form-urlencoded ' );
?? HTTP::Request对象的content方法定义了要传送给CGI程序的数据。Content应该是一个将要发送给post请求的字串。
?? HTTP::Request对象的as_string方法将以文本输出所返回的响应,包含了content方法所无法输出的一些附加信息。下例中将响应输出到文件句柄OUT所指向的文件中。
Print ( OUT $response -> as_string () );
?? head请求只返回请求的标头(headers)信息。标头包括对象类型、大小和存活时间这样的信息。当需要知道文档是否存在时,这是非常有用的。
3. LWP::Simple模块
?? 简单的LWP功能可以从LWP::Simple模块中获取,它提供了对LWP的过程调用接口,而不是以前的面向对象的方法。
?? LWP::Simple模块的getprint函数,他用来检索一个web网页并将其输出到一个文件句柄STDOUT(标准输出)。函数getprint返回了HTTP响应代码。
my $status = getprint ( $url );
?? LWP::Simple模块中的get函数检索到一个web网页,并将它的内容(content)储存在一个标量中。
my $page = get ( $url );
?? LWP::Simple模块中的getstore方法用来检索一个Web页面并将它储存在一个文件中。同样,getstore函数也返回HTTP响应代码。
$status = getstore ( $url, "page.txt");
4. HTML解析
?? HTML::TokeParser模块和LWP对于从web站点提取文本是非常有用的。
?? TokeParser构造函数的参数接收一个字串、一个字串引用或一个文件句柄。如果他接收一个字串,Perl会把它当成一个文件名来打开,从中读取数据。如果他接收一个字串引用,perl会把它当成一个数据引用来解析。如果他接收一个文件句柄,TokeParser对象将尝试从该文件句柄所指向的文件中读取数据。
?? TokeParser对象的get_token方法从解析文档中返回一个标志(token)。
?? 标志是数组引用,他的5种可能的类型是:开始标志(start token)、结束标志(end token)、文本标志(text token)、注释标志(comment token)和声明标志(declaration token)。
?? 一个开始标志(token)就是一个HTML开始标记(tag)。在一个开始标志的数组中,第一个元素是"S",下一个元素保存着标记名,接下来是一组标记变量,在下一个是包含每个标记属性的散列,最后一个元素是原文。
?? 一个结束标志的数组包含3个元素:"E"、标记名和原文(Original Text)。
?? 文本标志、注释标志和声明标志数组包含两个元素:一个代表类型的字符和标志中的文本。文本标志、注释标志和声明标志的类型分别是"T"、"C"、"D"。
5. 高级联网入门
所有的网络通讯是通过套接字(Socket)来完成的。套接字是通讯的端点。一个可以通讯的连接包括两个套接字。数据可以通过数据流和数据报的形式来传递。数据流提供了一种双向的、可靠的、有序的通讯传输方式。数据报的连接是比较不可靠的,在数据报的连接中,信息是通过一个小小的数据包传输的。数据报不如数据流可靠,但数据报需要较少的资源,因为它不需要在两台计算机之间建立永久的连接。所有连接需要两个套接字,一个由服务器程序维护,一个由客户端维护。
6. 传输控制协议TCP
?? 通常一个服务器应用安装在一台用于监听连接的计算机上(如等待web浏览器连接的web服务器)。客户程序必须知道她所要连接的服务器的地址。
?? 为了标准化网络中计算机间的会话,制定了许多协议。通常,一个邮件应用与两个不同的服务器进行通讯。它通过与POP服务器会话来接收用户邮件,与SMTP服务器会话来发送用户邮件。
?? 主要的面向连接的因特网协议是传输控制协议(TCP)。可以使用IO::Socket模块创建一个客户/服务器的聊天程序。使用这个模块容易的定义服务器的位置。
my $socket = new IO:Socket::INET (
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp' ,
Type => SOCK_STREAM )
or die ( "Cannot connect to $host:$port:$@ \n");
?? 端口号定义了服务器从哪里等待和接收用户的连接。
?? 可以使用模块IO::Scoket来创建一个IO::Scoket::INET对象。这是一个执行因特网连接的IO::Scoket对象。
?? 传递给构造函数4个参数:聊天服务器的IP地址(PeerAddr);为TCP聊天程序所设置的远程计算机端口(PeerPort);通讯协议(proto)以及用于判别数据流链接或数据报文连接的连接类型(Type)。
?? 行缓冲特殊变量 $| 定义了缓冲功能是否应当关闭。当$|定义为1时,表示缓冲功能应当关闭。
?? IO::Scoket::Net的参数LocalPort定义了服务器上的监听端口。
?? Type参数定义了创建连接的类型。
?? Listen参数定义了服务器开始不理新连接客户前,服务器上排队等待连接的用户数。对于服务器,Listen是必须定义的。
?? 类IO::Scoket::INET中的accept方法一直等待到有一个客户尝试访问他。一旦一个客户确实访问上服务器。服务器就建立起一个连接。 my $server = new IO::Socket::INET ( LocalPort => $port, Type => SOCK_STREAM, Listen => 10 ) or die ( " Cannot be a server on $port : $@ \n"); local $| = 1; my $client = $server -> accept(); my $response = ; 7. 简单邮件传输协议SMTP
?? 如果要发送邮件就需要一个SMTP服务器。Perl提供了一个用于处理STMP传输的模块,它就是Net::SMTP模块。
?? 第一个传送给构造函数的参数必须是一个合法的SMTP服务器地址。这个构造函数在一个步骤内创建对象并连接服务器。
?? 可以用可选参数来发送用户的邮件域(hello)、连接超时(Timeout)和一个判别调试是否应该关掉的指示器(Debug)。
?? 可以使用mail方法来创建一条新的邮件信息,它把用户的邮件地址作为参数。使用NET::SMTP中的to方法来定义邮件的接收者。Data方法开始传送邮件消息数据。一旦传送开始,可以通过datasend来发送信息。为了完成信息的传送,要使用dataend方法。Net::SMTP的quit方法关闭连接。
my $smpt = new Net::SMPT( "$server",hello => "server" )
or die ( " Cannot send e-mail : $! ");
$smtp -> mail( "$my_address");
$smtp -> to ( "$address");
$smtp -> data();
$smtp -> datasend ( "From: $from \n");
$smtp -> datasend ( " To : $to \n");
$smtp -> datasend (" Subject: $subject \n \n");
$smtp -> datasend (" $message \n");
$smtp -> data();
$smtp -> quit();
8. 邮局协议 POP
?? 邮局协议POP也是常见的一种协议,它便于从远程服务器上存储和检索邮件。POP服务器允许读取、阅读、存储和删除邮件。
?? Mail::POP3Client模块可用来读取邮件
?? Mail::POP3Client模块中的Count方法返回邮箱中的消息条数。
?? Mail::POP3Client模块中的Head方法返回消息标头,这些消息标头包含了关于邮件中所有的相关信息。
my $pop = new Mail::POP3Client (
USER => $user,
PASSWORD => $password,
HOST => $server ) ;
my $message = $pop -> Count();
9. 查找万维网
?? WWW::Search模块提供了一系列查找引擎的接口。这个模块为好几个模块所继承和扩展,使其于各种查找引擎的交互功能成为可能。
?? 为了定义一个查询,把用户输入的原始查询作为一个参数传给WWW::Search模块中的escape_query方法。这就把简单的语句转换成适合WWW::Search模块的HTML编码语句。
?? Native_query方法接收escape_query方法返回至,开始查询。
?? 为了从特定的查找引擎中取得结果,调用WWW::Search对象中的next_result方法。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/KataDoc360/archive/2008/11/30 /3413802.aspx