昨天我们说了urllib库是原生的底层库,我觉得原生的东西是好,但是都会有一个统一的缺点,就是用起来繁琐,使用者不如一些其他的库方便,功能也不如其他的库强大,我们今天就来说一说一个功能强大的Python HTTP库-------urllib3库
urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。
它也提供了一些python标准库里面没有的一些新特性:
- 线程安全
- 连接池
- 客户端SSL/TLS验证
- 文件分部编码上传
- 协助处理重复请求和HTTP重定位
- 支持压缩编码
- 支持HTTP和SOCKS代理
一、安装
urllib3有两种安装方式,都是非常简单好用
1.使用pip方式安装
pip install urllib3
2.使用源码进行安装
需要先下载源码 urllib3源码,在使用如下命令
python setup.py install
如果还是不明白请参照---》python源码安装详细步骤
二、使用
1.导入urllib3包
import urllib3
2.创建PoolManager
使用urllib3需要创建一个叫PoolManager实例的东西,不需要知道这是什么,你只要记住有这么个东西,你以后的各种操作PoolManager是基础,使用如下命令创建
http = urllib3.PoolManager()
3.生成第一个GET请求
有了HTTP之后我们就可以来生成第一个请求,使用如下命令
r = http.request('GET', 'https://www.baidu.com/') #请求方式为GET,如果使用POST换成POST即可
print(r.status)#如果请求成功,返回200
print(r.data.decode())#获得html编码
4.请求里的其他参数
- 设置headers
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
r = http.request('GET',
'https://www.baidu.com/',
headers=header) #请求里设置headers头
- Timeout
r = http.request('GET',
'https://www.baidu.com/',timeout=3.0)
也可以设置全局的timeout
http = urllib3.PoolManager(timeout=3.0)
这样所有的request都使用一个timeout
5.POST请求
我们可以使用POST方法向链接和服务器提交一些东西
- 向链接里添加一些东西
r = http.request('POST',
'https://www.baidu.com/',
fields={'hello':'world'})
这样链接里就包含了我们提交的信息
- 发送JSON数据
在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据
import json
data={'attribute':'value'}
encode_data= json.dumps(data).encode()
r = http.request('POST',
'https://www.baidu.com/',
body=encode_data)
- 上传文件,上传文件分两种一种是本地文本文件,另一种是本地二进制文件
上传本地文本文件
with open('test.txt','r+',encoding='UTF-8') as f:
file_read = f.read()
r = http.request('POST',
'https://www.baidu.com/',
fields={'filefield':('test.txt', file_read, 'text/plain')
})
上传二进制文件
with open('test.jpg','rb') as f2:
binary_read = f2.read()
r = http.request('POST',
'https://www.baidu.com/',
body=binary_read
})
6.编码方式
对于POST和PUT请求,需要手动对传入数据进行编码,然后加在URL之后
encode_arg = urllib.parse.urlencode({'arg': 'value'})
print(encode_arg.encode())
r = http.request('POST',
'https://www.baidu.com/'+encode_arg,
headers=header)
7.重定向,请求重试相关
- 可以通过设置retries参数来控制重定向次数,默认是3次
r = http.request('GET',
'https://www.baidu.com/',retries=6)
设置重定向次数为6次
- 关闭重定向,但是保留请求重试
r = http.request('GET',
'https://www.baidu.com/',redirect=False)
只需要将redirect设置为False即可
- 关闭重定向及请求重试
r = http.request('GET',
'https://www.baidu.com/',retries=False,redirect=False)
如上所示,全部设置为False即可
ps(上面添加的东西,如timeout、headers、重定向及重试次数,想全局生效只需要在PoolManager里面设置即可,设置方式和正常设置一样)
那么会有的朋友问了,如果在全局和局部都设置了怎么办?局部设置>全局设置
三、后记
学习了这个库,是不感觉比作态你对urllib强大了很多,但是这还不是最好用,最方便的,后面我们会将到
惯例 urllib3官方文档