Python核心编程3-Web开发部分 1.Web客户端和服务器


一、简介
  1. Web应用遵循客户端/服务器架构。 常见的Web客户端是浏览器。客户端可以向Web服务器发出各种不同的的请求,这些请求可能包括获得一个用于查看的网页视图,或者提交一个包含待处理数据的表单。Web服务器端首先处理请求,然后会以特定的格式(如HTML等)返回给客户端浏览。 
  2. Web客户端和服务器端交互需要用到特定的“语言”,就是Web交互需要用到的标准协议,称为HTTP(HyperText Transfer Protocol,超文本传输协议)。HTTP是TCP/IP的上层协议,也就是说HTTP依靠TCP/IP进行地层的交流工作。它的职责不是发送或传递消息(TCP/IP协议负责这些),而是通过发送、接收HTTP消息来处理客户端请求。
  3. HTTP属于无状态协议,因为其不跟踪从一个客户端到另一个客户端的请求信息,这点很像现在使用的客户端/服务器架构。服务器持续运行,但是客户端的活动是以单个事件划分的,一旦完成一个客户请求,这个服务事件就停止了。客户端可以随时发送新的请求,但是新的请求会处理成独立的服务请求。由于每个请求缺乏上下文,因此有些URL中会含有很长的变量和值,这些将作为请求的一部分,以提供一些状态信息。另一种方式是使用cookie,即保存在客户端的客户状态信息。
  4. 代理与反向代理: 代理服务器是一个有用的工具,它可能会与防火墙一起工作,通过代理服务器,网络管理员可以只让一部分计算机访问网络,也可以更好地监控网络的数据传输。代理服务器另一个有用的特性是可以缓存数据。若A访问了一个代理缓存过的Web页面,那么他的同事B再次访问这个页面时(当然时间不能隔的太久,否则缓存会清空),页面的加载速度会快很多。这是因为B的浏览器无需与Web服务器进行完整的交互,而是从代理服务器获得所有信息。根据代理服务器的运作方式,这种称为正向代理。       反向代理的作用与正向相反,其行为像是有一个服务器,客户端可以连接这个服务器。客户端访问这个后端服务器,接着后端服务器在网上进行真正的操作,获得客户端请求的数据。反向代理还可以缓存服务器的数据,如果其作为后端服务器,会将数据直接返回给客户端。
二、Python Web客户端工具(重点:urllib模块)
  1. 浏览器只是客户端的一种,任何一个向Web服务器发送请求获得数据的应用程序都是“客户端”。
  2. 简单的网页浏览需要用到名为URL(统一资源定位符)的Web地址。这个地址用来在Web上定位一个文档,或者调用一个CGI程序来为客户端生成一个文档。URL是多种统一资源标识符(URI。Uniform Resource Identifier)的一部分。这个超集也可以应对其他将来可能出现的标识符命名约定。一个URL是一个简单的URI。URL的组件有:
  • URL组件
    URL组件 描述
    prot_sch 网络协议或下载方案
    net_loc 服务器所在地(也许含有用户信息)
    path 使用/分割的文件或CGI应用的路径
    params 可选参数
    query 连接符&分割的一系列键值对
    frag 指定文档内特定锚的部分
其中net_loc又可以拆分为多个必需和可选组件: user(用户名或登录)+passwd(密码)+host(运行web服务器的计算机名称或地址,必需项)+port(默认为80,服务器端口号)。
3.Python支持两种不同的模块,以不同的功能和兼容性处理URL,分别是urlparse和urllib模块。
  • urlparse模块: 该模块提供了一些基本功能,用于处理URL字符串。这些功能包括urlparse()、urlunparse()和urljoin()。urlparse()将URL字符串拆分成其主要组件。语法结构:urlparse(urlstr,defProtSch=None,allowFrag=None) ,将会返回一个六元组。 urlunparse()则与urlparse()功能相反。  urljoin()用于处理多个相关URL。
  • urllib模块:除非要写一个更加低层的网络客户端,否则urllib模块就能满足所有需要。它提供了一个高级的Web通信库,支持基本的Web协议,如HTTP、FTP和Gopher协议,同时也支持对本地文件的访问。具体来说,urllib模块的功能是利用前面介绍的协议来从Internet、局域网、本地主机上下载数据。使用这个模块就无需用到httplib、ftplib等模块了。    在Python3中,所有相关的模块(如urllib、urlparse、urllib2等)都被整合进了urlib的单一包中。urllib和urllib2中的内容整合进了urllib.request模块中,urlparse整合进了urllib.parse中。Python3中的urllib包还包括response、error和robotparse这些子模块。
urllib模块提供了许多函数,可用于从指定URL下载数据,同时也可以对字符串进行编码、解码工作,以便能在URL中以正确的形式显示出来。
  1. urllib.request.urlopen():用于打开一个给定URL字符串表示的Web链接,并返回文件类型的对象。语法结构:                                                             f =urlopen(urlstr,postQueryData=None)。urlopen()打开urlstr 所指向的URL。如果没有给定协议或者下载方案(Scheme),或者传入了“file”方案,urlopen()会打开一个本地文件。                       
     对于所有的HTTP请求,常见的请求类型是“GET”。在这些情况中,向Web服务器发送的请求字符串(编码过的键值对,如urlencode()函数返回的字符串)应该是urlstr的一部分。 如果使用“POST”请求方法,请求的字符串(编码过的)应该放到postQueryData 变量中(本章后续部分将介绍关于“GET”和“POST”方法的更多信息,但这些HTTP 命令是通用于Web 编程和HTTP 本身的,并不特定于Python)。
     一旦连接成功,那么urlopen()将会返回一个文件类型对象,就像在目标路径下打开了一个可读文件。通过句柄来使用一些读取内容的方法,如f.read()、f.close()等
  2. urllib.request.URLopener.retrieve():该方法不是用来以文件的形式访问并打开URL而是用于下载完整的HTML,将其另存为文件。用法:urlretrieve(url,filename=None,reporthook=None,data=None)         除了像urlopen()这样从URL中读取内容,urlretrieve()可以方便地将urlstr中的整个HTML文件下载到本地硬盘。下载后的数据可以存成一个localfile或一个临时文件。如果该文件已经复制到本地或者url指向的文件就是本地文件,就不会发生后面的下载动作。
     如果提供了downloadStatusHook,则在每块数据下载或传输完成后会调用这个函数。调用时使用以下三个参数:目前读入的块数、块的字节数、文件的总字节数。如果正在使用文本或图表向用户显示“下载状态”信息,这个函数将非常有用。
     urlretrieve()返回一个二元组(filename,mime_hdrs)。filename是含有下载数据的本地文件名,mime_hdrs是Web服务器响应后返回的一系列MIME文件头(MIME:多目标因特网邮件扩展。MIME的头文件通知浏览器返回的文件类型,以及可以用哪类应用程序打开。要获得更多的信息,可以查看mimetools模块的Message类。对本地文件来说,mime_hdrs是空的。)
  3. urllib.parse.quote()和urllib.parse.quote_plus():quote*()函数用于获取URL数据,并将其编码,使其可以用于URL字符串中。具体来说,必须对某些不能打印或者不被Web服务器作为有效URL接收的特殊字符串进行转换。这就是quote*()函数的功能。语法: quote(urldata,safe = '/')                  逗号、下划线、句号、斜线和字母数字这类符号不需要转换,其他的则均需要转换。另外那些URL不能使用的字符前面会被加上百分号%同时转换为十六进制。例如"%xx",其中xx表示这个字母的ASCII码的十六进制值。当调用quote*()时,urldata字符串转换成一个可在URL字符串中使用的等价字符串。safe字符串可以包含一系列不能转换的字符,默认字符是斜线/ 。quote_plus()和quote()很像,只是它还可以将空格编码为“+”号。对比:Python核心编程3-Web开发部分 1.Web客户端和服务器 同样在这个模块里有unquote()和unquote_plus()用来将“%xx”形式的字符转化为等价的ASCII码值。 unquote(urldata)。
  4. urllib.parse.urlencode():该函数接收字典的键值对,并将其翻译成字符串,最为CGI请求的URL字符串的一部分。键值对的格式是”键=值“,以连接符&划分。另外,键及其对应的值会传到quote_plus()函数中进行适当的编码。Python核心编程3-Web开发部分 1.Web客户端和服务器