目录

Python网络请求神器urllib3

一、前言

  • urllib3是Python的一个强大的,健全的HTTP客户端。许多Python生态系统已经使用urllib3,urllib3带来了Python标准库中缺少的许多关键功能。
  • 1、urllib3是线程安全。
  • 2、urllib3原生支持连接池。
  • 3、支持客户端SSL / TLS验证。
  • 4、可使用多编码进行文件上传。
  • 5、自动重试请求并处理HTTP重定向。
  • 6、支持gzip和deflate编码。
  • 7、代理支持HTTP和SOCKS。
  • 8、官方完成了100%测试覆盖率。

二、使用简单

  • urllib3功能强大,且易于使用,我们看下官方给出的一个示例:

import urllib3 http = urllib3.PoolManager() r = http.request(‘GET’, ‘http://httpbin.org/robots.txt') print(r.status) 200 print(r.data) ‘User-agent: *\nDisallow: /deny\n’

  • 如此我们便完成了一个网络请求,注意http是从Poolmanager里面取的哦,也就是其已支持连接池功能。

三、安装方便

  • 我们再来看看urllib3的安装,其安装也是非常简单的。
  • 我们可以用python的pip直接安装:

python3: $ pip3 install urllib3 python2: $ pip install urllib3

四、搬砖历程

  • OK,看到这里的小伙伴我就默认你们都装好urllib3了哦。
  • 接来下我们一步一步来学习urllib3
  • 1、第一步,我们当然是要导入urllib3模块
  • import urllib3
  • 2、创建hhttp对象
  • http对象通过PoolManager来获取,PoolManager负责处理连接池和线程安全性的所有细节,如此我们便不用再花精力取管理了。
  • http = urllib3.PoolManager()
  • 3、发起get请求
  • 获得了http对象后,我们就可以开始编写我们的请求代码了
  • 发起一个普通的git请求,请求后其会返回一个HTTPResponse对象,我们将在后面再详细学习该对象的操作。

import urllib3 http = urllib3.PoolManager() r = http.request(‘GET’, ‘http://httpbin.org/robots.txt') print(r.data) b’User-agent: *\nDisallow: /deny\n’

  • 4、发起post请求
  • 我们发送post请求也是非常方便的,发送的数据可以是json、文件、或者是二进制数据

import urllib3 http = urllib3.PoolManager() r = http.request(‘POST’,‘http://httpbin.org/post',fields={'hello': ‘world’})

  • 5 、解析响应请求
  • 发起请求后,我们可以通过HTTPResponse对象提供的status,data和headers来分别获取请求状态,响应数据已经头部等信息

import urllib3 http = urllib3.PoolManager() r = http.request(‘GET’, ‘http://httpbin.org/ip') print(r.status) 200 print(r.data) b’{\n “origin”: “104.232.115.37”\n}\n’ print(r.headers) HTTPHeaderDict({‘Content-Length’: ‘33’, …})

  • 6、解析json数据
  • 可以通过解码和反序列化请求的数据属性来加载JSON内容

import json import urllib3 http = urllib3.PoolManager() r = http.request(‘GET’, ‘http://httpbin.org/ip') json.loads(r.data.decode(‘utf-8’)) {‘origin’: ‘127.0.0.1’}

  • 7、设置头部请求数据
  • 可以在request中以字典的形式设置中头部信息,request参数名指定为headers即可。

import urllib3 http = urllib3.PoolManager() r = http.request(‘GET’,‘http://httpbin.org/headers',headers={'X-Something': ‘value’}) json.loads(r.data.decode(‘utf-8’))[‘headers’] {‘X-Something’: ‘value’, …}

  • 8 设置查询参数
  • 对于GET,HEAD和DELETE请求,我们可以简单地将参数作为字典传递给request()的fields参数即可。

import urllib3 http = urllib3.PoolManager() r = http.request(‘GET’,‘http://httpbin.org/get',fields={'arg': ‘value’}) json.loads(r.data.decode(‘utf-8’))[‘args’] {‘arg’: ‘value’}

  • 对于POST和PUT请求,需要在URL中手动编码查询参数

from urllib.parse import urlencode import urllib3 http = urllib3.PoolManager() encoded_args = urlencode({‘arg’: ‘value’}) url = ‘http://httpbin.org/post?' + encoded_args r = http.request(‘POST’, url) json.loads(r.data.decode(‘utf-8’))[‘args’] {‘arg’: ‘value’}

  • 9、表单数据处理
  • 对于PUT和POST请求,urllib3将自动对提供给request()的fields参数中的字典进行编码。

import urllib3 http = urllib3.PoolManager() r = http.request(‘POST’,‘http://httpbin.org/post',fields={'field': ‘value’}) json.loads(r.data.decode(‘utf-8’))[‘form’] {‘field’: ‘value’}

  • 10、提交json数据
  • 通过将编码的数据指定为body参数并在调用request()时设置Content-Type标头来发送JSON请求。

import json import urllib3 http = urllib3.PoolManager() data = {‘attribute’: ‘value’} 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’] {‘attribute’: ‘value’}

  • 11、提交文件或者二进制数据
  • 对于使用multipart / form-data编码上传文件,使用与Form数据相同的方法,并将文件字段指定为(file_name,file_datam,file_tyle)的元组,第三个file_type可选,建议加上

import urllib3 http = urllib3.PoolManager() 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’: ‘…’}

  • 12、上传图片
  • 发送图片也就是发送二进制数据,对于发送二进制数据,只需指定body参数即可。建议设置Content-Type参数,例如jpg格式的图片,headers={‘Content-Type’: ‘image/jpeg’})。

import urllib3 http = urllib3.PoolManager() 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’…’

五、搬砖升级版

  • 在实际开发中,我们可能遇到的情况很多,如请求超时,有时需要重新请求以及错误异常等。

  • 13、请求超时

  • urllibe3允许我们去控制请求多长时间没有响应即为超时。

import urllib3 http = urllib3.PoolManager() http.request(‘GET’, ‘http://httpbin.org/delay/3', timeout=4.0) <urllib3.response.HTTPResponse> http.request(‘GET’, ‘http://httpbin.org/delay/3', timeout=2.5) MaxRetryError caused by ReadTimeoutError

  • 我们的服务端对于请求是延迟3秒钟响应的,所以第二个设置了2.5秒即为超时后就会触发超时功能了。

  • 14、配置重试次数

  • 默认的urllib3会重试3次,我们可以通过配置retries来指定重试次数,关闭重试功能配置为False即可

http.requests(‘GET’, ‘http://httpbin.org/ip', retries=10)

  • 如果你关闭了重试功能,我们的重定向302也会受到影响,如果我们想关闭重定向,但是保留重试,我们可以这样

r = http.request(‘GET’, ‘http://httpbin.org/redirect/1', redirect=False)

  • 15、异常处理
  • 对于异常处理,我们直接捕获即可

try:http.request(‘GET’, ’nx.example.com’, retries=False) except urllib3.exceptions.NewConnectionError: print(‘Connection failed.’)

  • 16、log处理
  • urllib3还为我们提供来log功能,我们直接设置level即可控制日志的输出

logging.getLogger(“urllib3”).setLevel(logging.WARNING)