Python 使用http包
文章目录
在Python程序中,包 http实现了对HTTP协议的封装,在本节的内容中,将详细讲解在Python程序中使用使用 http 包的知识。
一、http包介绍
在Python语言的HTTP包中,主要包含如下表所示的模块。
模块名称 | 描述 |
---|---|
http.client | 底层的HTTP协议客户端,可以为urllib.request模块所用 |
http.server | 提供了基于socketserver模块的基本HTTP服务器类 |
http.cookies | cookies的管理工具 |
http.cookiejar | 提供了cookies的持久化支持 |
在http.client 模块中,主要包括如下两个用于客户端的类。
(1)HTTPConnection:基于HTTP协议的访问客户端。
(2)HTTPResponse:基于HTTP协议的服务端回应。
二、使用http.client模块
在 http.client模块中,定义了实现 http 和 https协议客户端的类。通常来说,不能直接使用http.client模块,需要模块urllib.request调用该模块来处理 HTTP 和 HTTPS 的 URL。
1.类
在模块http.client中包含了如下所示的类:。
(1)类HTTPConnection
类 HTTPConnection的语法格式如下所示:
http.client.HTTPConnection (host,port=None,[timeou,]source_address==None)
一个 HTTPConnection实例表示与HTTP服务器端的一次事务处理,通过传递参数host地址和 port端口号进行实例化。如果没有port端口号传递参数,也可以通过传递参数,传递格式是:host:port。如果这两个参数都没有的话,则默认端口号为80。如果提供了可选参数timeout,则将在给出的秒数后执行阻塞操作表示超时。可选参数source_address可 以是一个元组,形式同(host, port),作为HTTP链接的源地址使用。
(2)HTTPSConnection
类HTTPSConnection的语法格式如下所示:
http.client.HTTPSConnection (host, port=None, key_file=None, cert_file=None,[timeout, ]source_ address=None, *,context=None, check_hostname=None)
类 HTTPSConnection是 HTTPConnection的子类,使用 SSL,用于实现与服务器端的安全通信。默认端口是443。如果需要指定上下文context,必须使用ssl.SSLContext实例化,用于描述不同的SSL选项。
(3)类HTTPResponse
类HTTPResponse的语法格式如下所示:
class http.client.HTTPResponse (sock, debuglevel=0, method=None,url=None)
类HTTPResponse是在连接成功后返回的实例,不需要用户直接进行实例化操作。
(4)异常类,如下表所示。
类名称 | 描述 |
---|---|
exception http.client.HTTPException | 是本模块内其他异常的基类,本身是Exception类的子类 |
exception http.client.NotConnected | 是HTTPException类的子类 |
exception http.client.InvalidURL | 是HTTPExcention类的子类,如果端口号传参为空或不是数字型的,都会引起该异常 |
exception http.client.UnknownProtocol | 是HTTPException类的子类 |
exception http.client.UnknownTransferEncoding | 是HTTPException类的子类 |
exception http.client.UnimplementedFileMode | 是HTTPException类的子类 |
exception http.client.IncompleteRead | 是HTTPException类的子类 |
exception http.client.ImproperConnectionState | 是HTTPException类的子类 |
exception http.client.CannotSendRequest | 是 ImproperConnectionState类的子类 |
exception http.client.CannotSendHeader | 是 ImproperConnectionState类的子类 |
exception http.client.ResponseNotReady | 是 ImproperConnectionState类的子类 |
exception http.client.BadStatusLine | 是 HTTPExcention类的子类,如果服务器端响应的HTTP状态码是我们所不知道的就会引起该异常 |
exception http.clicnt.LineTooLong | 是 HTTPExcention类的子类,如果从服务器端收到超长行的HTTP协议内容就会引起该异常 |
exception http.client.RemoteDisconnected | 是类 ConnectionResetError和类 BadStatusLine 的子类。由方法HTTPConnection.getresponse()引起,当试图读取连接的响应结果时,读取不到数据,意味着远端已关闭了连接 |
2.HTTPConnection中的方法
(1)HTTPConnection.request(method, url, body=None,headers={}):功能是使用指定的method 方法和 url 链接向服务器发送请求。
● body: 如果指定了body部分,那么 body部分将在header部分发送完之后发送过去。body部分可以是一个字符串、字节对象、文件对象或者是字节对象的迭代器。不同的body类型对应不同的要求。
● header: 是 HTTP头部的映射,是一个字典类型。如果在header中不包含ContentLength项,那么会根据body的不同自动添加上去。
(2) HTTPConnection.getresponse(): 功能是在请求发送后才能调用得到服务器返回的内容,返回的是一个HTTPResponse 实例。
(3)HTTPConnection.set_debuglevel(level): 设置调试级别,默认调试级别是0,表示没有调试输出。任何大于0的值都将导致所有当前定义的调试输出被打印到stdout,debuglevel会传递到创建的任何新 HTTPResponse对象中。
(4) HTTPConnection.set_tunnel(host, port=None, headers=None): 设置HTTP Connect隧道的主机和端口,允许通过代理服务器运行连接。
(5) HTTPConnection.connect(): 连接指定的服务器。在默认情况下,如果客户端没有连接,则会在request请求时自动调用该方法。
(6)HTTPConnection.close(): 关闭与服务器的连接。
(7) HTTPConnection.putrequest(request,selector, skip_host=False, skip_accept_encoding=False): 当和服务器的链接成功后,应当首先调用这个方法。发送到服务器的内容包括: request字符串、selector字符串和HTTP协议版本。
(8) HTTPConnection.putheader(header, argument[,…]: 发送HTTP头部到服务器,发送到服务器的内容包括: header 头部、冒号、空格和参数列表中的第一个。
(9)HTTPConnection.endheaders(message_body=None): 发送一个空白行到服务器,标志头部的结束。其中可选参数message_body用于传递与请求相关联的消息体。如果消息头是字符串,消息体将与消息头在相同的分组中发送,否则它将在单独的分组中发送。
3. HTTPResponse中的方法
在Python程序中,HTTPResponse实例包含了从服务器返回的HTTP回应,提供了访问请求头部和 body部分的方法。HTTPResponse是一个可迭代的对象,而且可以使用with 语句来声明。在类 HTTPResponse中包含的方法如下所示。
(1)HTTPResnonse.read([amt]): 读取和返回 resnonse的body部
(2)HTTPResponse.readinto(b): 读取指定的字节长度len(b),并返回到缓冲字节b,返回值是读取的字节数。
(3)HTTPResponse.getheader(name,default=None): 返回指定名称name的HTTP头部值,如果没有相应匹配的name值,则返回默认的None。如果有多个相匹配的name值,则返回所有的值,用逗号进行分隔。
(4)HTTPResponse.getheaders(): 以元组的形式返回所有的头部信息(header,value)。
(5)HTTPResponse.fileno(): 返回底层套接字的 fileno。
(6)HTTPResponse.msg: 包含响应标头的 http.client.HTTPMessage实例,http.client.HTTPMessage是email.message.Message的子类。
(7)HTTPResponse.version: 服务器使用的HTTP 协议版本。其中10用于HTTP / 1.0,11用于HTTP/1.1。
(8)HTTPResponse.status: 服务器返回的状态代码。
(9)HTTPResponse.reason: 服务器返回的原因短语。
(10)HTTPResponse.debuglevel: 调试等级,如果 debuglevel大于零,则会在读取和解析响应时将消息打印到stdout。
(11)HTTPResponse.closed: 如果数据流已经关闭,则值为True。
三、使用HTTPConnection 对象访问指定网站
在下面的实例中,演示了使用http.client.HTTPConnection对象访问指定网站的过程具体实现代码如下所示:
from http.client import HTTPConnection #导入内置模块
#基于HTTP协议的访问客户端
mc = HTTPConnection('www.baidu.com:80') #设置 GET请求方法
mc.request('GET','/')
res = mc.getresponse() #获取访问的网页
print('以下是获取到的信息:')
print(res.status, res.reason) #打印输出响应的状态
print(res.read().decode('utf-8')) #显示获取的内容
在上述实例代码中只是实现了一个基本的访问实例,首先实例httn client HTTPConnection对指定请求的方法为GET,然后使用 getresnonse()方法获取访问的网页,并打印输出响应的状态。执行会输出: