Web服务有点像对计算机友好的网页。 它们基于让程序能够通过网络交换信息的标准和协议,通常其中一个程序请求信息或服务(客户端或服务请求者), 而另一个程序提供信息或 服务(服务器或服务提供者)。 确实,Web服务器很容易理解,而且看起来与前面讨论的网络编程很像, 不过也存在差别。
Web服务通常运行在极高的抽象层级中,将HTTP(Web使用的协议)用作底层协议。 在这个协议上面,它们使用更为面向内容的协议(如XML格式)来对请求和响应进行编码。 这意味着 Web服务器可作为Web服务的平台。正如本节的标题指出的,它将Web抓取提高到另一个层级。 可将Web服务看作为计算机客户(而不是人类)设计的动态网页。
有些Web服务标准非常复杂,但在不涉及任何复杂方面的情况下也能完成很多任务。 本节将简要地介绍这个主题,并提供在哪里能够找到所需工具和信息的指南。
注意:鉴于实现Web服务的方式众多(且涉及大量的协议), 同时每个Web服务系统都可能提供多种服务,因此有时必须以客户端能够自动解读的方式描述服务, 这被称为元服务。有关这种描述的标准是Web服务描述语言(WSDL)。 WSDL是一种XML格式,描述了通过服务可使用哪些方法以及这些方法的参数和返回值等方面。 除支持SOAP等服务协议外, 很多乃至大部分Web服务工具包都支持WSDL。
RSS指的是富网站摘要(Rich Site Summary)、RDF网站摘要(RDF Site Summary)或简易信息聚合(Really Simple Syndication), 具体指哪个取决于版本。在最简单的情况下, RSS是一种以 XML方式列出新闻的格式。RSS文档(feed)与其说是静态文档, 不如说是服务,因为它们需要定期或不定期地更新。它们甚至还需动态地计算, 以呈现最新博客更新,等等。另一种作用与RSS 相同的较新格式是Atom。 有关 RSS 以及相关资源描述框架( RDF )的详细信息, 请参阅 http://www.w3.org/RDF 。 有关Atom规范请参阅http://tools.ietf.org/html/rfc4287 。
市面上的RSS阅读器很多,它们通常也能处理其他格式,如Atom。 鉴于RSS格式易于处理, 因此不断有开发人员探索出它的新用途。 例如,有些浏览器(如Mozilla Firefox)允许用户将RSS feed收藏为书签, 进而提供一个动态的书签子菜单,其中的菜单项为不同的新闻。 RSS还是播客 的支柱(播客其实就是列出声音文件的RSS feed)。
问题是,如果要编写客户端程序来处理来自多个网站的feed, 就必须准备解析多种不同的 格式,甚至需要对feed条目中的HTML片段进行解析。 为此,可使用BeautifulSoup(或其面向XML 的版本), 但更佳的选择是使用Mark Pilgrim开发的Universal Feed Parser(https://pypi.python.org/pypi/feedparser ), 因为它能够处理多种feed格式(包括RSS和Atom及其扩展), 并在一定程度上支 持内容清理。 Pilgrim还撰写了一篇很有用的文章“Parsing RSS At All Costs”(http://xml.com/pub/a/2003/01/22/dive-into-xml.html ), 如果想自己处理清理,可参考这篇文章。
除简单的RSS下载和解析机制外,还有远程过程调用。远程过程调用是对基本网络交互的抽 象: 客户端程序请求服务器程序执行计算并返回结果,但这个过程被伪装成简单的过程(函数或 方法)调用。 在客户端代码中,远程过程调用看起来就像普通方法调用, 但用来调用方法的对象 实际上位于另一台计算机中。 XML-RPC可能是最简单的远程过程调用机制,它使用HTTP和XML 来实现网络通信。 鉴于这种协议是独立于语言的, 使用一种语言编写的客户端程序可轻松地调用使用另一种语言编写的服务器程序中的函数。
提示:如果在网上搜索,将找到大量用于Python的其他RPC机制。 Python标准库提供了对客户端和服务器端XML-RPC编程的支持。 有关XML-RPC的使用示例。
远程过程调用可与表述性状态转义式(REST)网络编程比肩,不过这两种机制有天壤之 别。 基于REST的(RESTful)程序也能让客户端以编程方式访问服务器, 但服务器程序不能有 任何隐藏的状态, 返回什么样的数据完全由指定的URL(在HTTP POST中,是客户端提供的 额外数据)决定。
有关REST的详细信息可在网上找到。例如,可参阅维基百科的相关文章(http://en.wikipedia.org/wiki/Representational_State_Transfer )。 在RESTful编程中,经常使用的一种协议 是JavaScript对象表示法(JSON,http://www.json.org ), 它简单而优雅,能够使用纯文本格式来表示复杂的对象。标准库模块json提供了对JSON格式的支持。
SOAP也是一种将XML和HTTP用作底层技术的消息交换协议。 与XML-RPC一样,SOAP也 支持远程过程调用,但SOAP规范比XML-RPC规范复杂得多。 SOAP是异步的,支持有关路由的 元请求,而且类型系统非常复杂(而XML-RPC使用简单而固定的类型集)。
当前,没有标准的Python SOAP工具包,可以考虑使用Twisted(http://twistedmatrix.com )、 ZSI(http://pywebsvcs.sf.net )或SOAPy(http://soapy.sf.net )。有关SOAP的详细信息,请参阅 http://www.w3.org/TR/soap 。