Python 中自带了 http 模块,它可以满足基本的 http 请求处理;除此之外,还有最为人所熟知的 requests,它虽然是一个第三方模块,但是按照目前的情形来看,已经成为了事实上的 Python HTTP 请求标准库。
内置的 http 模块
自带的 http 包中含有几个用来开发 HTTP 协议的模块。
- http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。
- http.server 是基于 socket server 的基本 HTTP 服务器。
- http.cookies 是 cookie 相关的内容及相关策略。
- http.cookiejar 是针对 cookie 模块的管理封装。
http.client 模块
http.client 模块主要是客户端的 HTTP 通信实现库,主要是发送和接收 HTTP 报文。
其中主要是以下类:
- HTTPConnection:基于 HTTP 协议的客户端,指定 URL 后,可以发送请求报文和接收响应报文。
- HTTPResponse:封装来自服务器的 HTTP 响应,它提供对请求头和实体主体等的访问。
http.client HTTPConnection 类
构造函数:
def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None):
参数:
- host:请求的服务器host,不能以 http:// 等协议开头;
- port:请求服务器的端口,数字类型;
- timeout:单次请求的 socket timeout,未设置时,默认使用模块内的全局超时时间,Python2.6 版本新加的;
- source_address:可选参数,是一个(主机,端口)的元组作为HTTP连接的源地址,Python3.2 版本新加的;
request 方法:
使用 HTTP 请求方法和向服务器发送请求。
def request(self, method, url, body=None, headers={}, *, encode_chunked=False):
参数:
- method:HTTP 请求的方式,如 'GET'、'POST' 等字符串形式,必须要大写形式;
- url:请求的 url 路径;
- body:请求的 body 数据;
- headers:请求追加的头信息,字典类型;
- encode_chunked:仅当在 headers 中指定传输编码时,encode_chunked 参数才相关。如果 encode_chunked 是 False,则 HTTPConnection 对象假定所有编码由调用代码处理。如果它是 True,主体将被块编码;
getresponse 方法:
在发送请求后,调用此方法从服务器获取相应响应信息。
def getresponse(self):
返回值:
返回 HTTPResponse 对象实例。
http.client HTTPResponse 类
字段:
status:服务器返回的状态码;
reason:服务器返回的原因短语;
read 方法:
读取并返回响应正文,或直到下一个 amt 字节。
def read(self, amt=None):
参数:
- amt:可选参数,表示读取指定长度的字符,默认为 None,即读取所有内容;
示例
import http.client
http_conn = http.client.HTTPConnection('www.kfa.or.kr')
http_conn.set_debuglevel(1)
http_conn.request('GET', '/national/gamelist2.asp', headers={'User-Agent': 'python3.6/http'})
response = http_conn.getresponse()
print('\n')
print('-------------')
print(response.status)
print(response.read().decode('utf-8'))
requests 三方模块
GET 请求
使用 requests 发出 GET 请求是一件很简单的事情,只需要两步:
- 引入
requests
; - 调用
requests.get()
方法。
例如:
import requests
r = requests.get('http://www.baidu.com')
print(r)
获取请求的响应状态码:
<Response [200]>
处理响应
在发出 HTTP 请求之后,我们需要对服务器返回的响应进行处理。
requests 提供了3种响应形式供我们选择和使用:
.content
:原始的响应主体字节;.text
:经过编码后的响应主体字符串;.json()
:经过 JSON 处理的响应主体。
此外,http 的状态码通过 status_code 字段获取,状态码有如下5个大类:
1xx
:表示信息;2xx
:表示请求被接收;3xx
:表示请求被重定向了;4xx
:表示客户端错误;5xx
:表示服务器错误。