urllib3是一个功能强大、条理清晰,用于HTTP客户端的python库,许多python的原生系统已经开始使用urllib3.urllib3提供了很多python标准库里没有的特性:
1、线程安全
2、连接池
3、客户端SSL/TLS验证
4、文件分部编码上传
5、协助处理重复请求和HTTP重定位
6、支持压缩编码
7、支持HTTP和SOCKS代理
8、100%测试覆盖率
urllib3用法示例:
urllib3用法
生成请求(request)
1、导入urllib3模块
2、需要一个PoolManager示例来生成请求,由该实例对象处理与线程池的连接以及线程安全的所有细节,不需要任何人为操作:
3、通过request()方法创建一个请求:
查看request()方法源码:
def request(self, method, url, fields=None, headers=None, **urlopen_kw):
- 第一个参数method 必选,指定是什么请求,\'get\'、\'GET\'、\'POST\'、\'post\'、\'PUT\'、\'DELETE\'等,不区分大小写。
- 第二个参数url,必选
- 第三个参数fields,请求的参数,可选
- 第四个参数headers 可选
request()方法返回一个HTTPResponse对象。
可通过dir()查看所有属性和方法
dir(r)
只截取了一部分
#\'data\', \'decode_content\', \'enforce_content_length\', \'fileno\', \'flush\', \'from_httplib\',
# \'get_redirect_location\', \'getheader\', \'getheaders\', \'headers\', \'info\', \'isatty\',
# \'length_remaining\', \'read\', \'read_chunked\', \'readable\', \'readinto\', \'readline\',
# \'readlines\', \'reason\', \'release_conn\', \'retries\', \'seek\', \'seekable\', \'status\',
# \'stream\', \'strict\', \'supports_chunked_reads\', \'tell\', \'truncate\', \'version\', \'writable\',
# \'writelines\']
可以通过request()方法向请求(request)中添加一些其他信息,如:
请求(request)中的数据项(request data)可包含:
- headers:
在request()方法中,可以定义一个字典类型(dictionary),并作为headers参数传入:
- Query parameters:
对于GET、HEAD和DELETE请求,可以简单的通过定义一个字典类型作为fields参数传入即可:
对于POST和PUT请求(request),需要手动对传入数据进行编码,然后加在URL后
- Form data
对于PUT和POST请求(request),urllib3会自动将字典类型的field参数编码成表格类型.
- JSON
在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据:
- Files & binary data:
使用multipart/form-data编码方式上传文件,可以使用和传入Form data数据一样的方法进行,并将文件定义为一个元组的形式(file_name,file_data):
文件名(filename)的定义不是严格要求的,但是推荐使用,以使得表现得更像浏览器。同时,还可以向元组中再增加一个数据来定义文件的MIME类型: 如果是发送原始二进制数据,只要将其定义为body参数即可。同时,建议对header的Content-Type参数进行设置:
- Timeout :
使用timeout,可以控制请求的运行时间。在一些简单的应用中,可以将timeout参数设置为一个浮点数:
要进行更精细的控制,可以使用Timeout实例,将连接的timeout和读的timeout分开设置: 如果想让所有的request都遵循一个timeout,可以将timeout参数定义在PoolManager中: 或者 当在具体的request中再次定义timeout时,会覆盖PoolManager层面上的timeout。
- 请求重试(retrying requests):
Urllib3 可以自动重试幂等请求,原理和handles redirect一样。可以通过设置retries参数对重试进行控制。Urllib3默认进行3次请求重试,并进行3次方向改变。
给retries参数定义一个整型来改变请求重试的次数:关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可: 关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可: 要进行更精细的控制,可以使用retry实例,通过该实例可以对请求的重试进行更精细的控制。
例如,进行3次请求重试,但是只进行2次重定向:
如果想让所有请求都遵循一个retry策略,可以在PoolManager中定义retry参数:
或者
当在具体的request中再次定义retry时,会覆盖 PoolManager层面上的retry。