urllib3是一款Python 3的HTTP客户端。
Python标准库提供了urllib。在Python 2中,另外提供了urllib2;而在Python 3中,重构了urllib和urllib2到标准库urllib,并另外提供了urllib3。
1. urllib3的特性
2. 安装
urllib3不是Python 3的标准库,要使用需要另外安装,pip命令如下:
pip install urllib3
3. 用法
1) HTTP GET请求
>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/robots.txt')
>>> r.status
200
>>> r.data
...
>>> r.headers
...
注意:任何HTTP请求,只有通过PoolManager对象发出,才能够提供连接缓冲池和线程安全特性。
任何请求的返回对象都是HTTPResponse对象,其中包含status, data和headers三个属性。
2) HTTP POST请求
>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('POST', 'http://httpbin.org/post', fields={'hello': 'Xiangbin'})
>>> r.status
200
>>> r.data
...
>>> r.headers
...
3) JSON响应的处理
>>> import urllib3
>>> import json
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/ip')
>>> r.data
b'{\n "origin": "10.23.1.37"\n}\n'
>>> json.loads(r.data.decode('utf-8'))
{'origin': '127.0.0.1'}
注意:使用json的loads()方法
4) 流式响应的处理
>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/bytes/1024', preload_content=False)
>>> for chunk in r.stream(32):
... print(chunk)
...
>>> r.release_conn()
注意:preload_content=False表示流式处理响应数据。
处理stream()方法读取响应数据之外,还可以使用read()方法,示例如下:
>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/bytes/1024', preload_content=False)
>>> r.read(4)
b'\x88\x1f\x8b\xe5'
>>> r.release_conn()
5) 请求带参数
>>> r = http.request('GET', 'http://httpbin.org/headers', fields={'hello': 'Xiangbin'}, headers={'X-Something': 'value'})
对于POST和PUT方法,需要将参数编码后,这样才可以追加到URL,示例如下:
>>> from urllib.parse import urlencode
>>> encoded_args = urlencode({'arg': 'value'})
>>> url = 'http://httpbin.org/post?' + encoded_args
>>> r = http.request('POST', url)
当然,最好还是以fields参数形式,urllib3将自动编码,示例如下:
>>> r = http.request('POST', 'http://httpbin.org/post', fields={'hello': 'Xiangbin'})
使用JSON模块,还可以以body形式发送请求参数,示例如下:
>>> import json
>>> data = {'Hello': 'Xiangbin'}
>>> encoded_data = json.dumps(data).encode('utf-8')
>>> r = http.request('POST', 'http://httpbin.org/post', body=encoded_data, headers={'Content-Type': 'application/json'})
>>> json.loads(r.data.decode('utf-8'))['json']
{'Hello': 'Xiangbin'}
6) 上传文件
文本文件
>>> with open('example.txt') as fp:
... file_data = fp.read()
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... fields={
... 'filefield': ('example.txt', file_data, 'text/plain'),
... })
>>> json.loads(r.data.decode('utf-8'))['files']
{'filefield': '...'}
注意:上传文件必须使用POST方法。
二进制文件
>>> with open('example.jpg', 'rb') as fp:
... binary_data = fp.read()
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... body=binary_data,
... headers={'Content-Type': 'image/jpeg'})
>>> json.loads(r.data.decode('utf-8'))['data']
b'...'
参考链接:
http://urllib3.readthedocs.io/en/latest/index.html
https://github.com/shazow/urllib3