Urllib3 是一个功能强大, 条理清晰, 用于 HTTP 客户端的 Python 库. 许多 Python 的原生系统已经开始使用 urllib3.Urllib3 提供了很多 python 标准库 urllib 里所没有的重要特性:
线程安全
连接池
客户端 SSL/TLS 验证
文件分部编码上传
协助处理重复请求和 HTTP 重定位
支持压缩编码
支持 HTTP 和 SOCKS 代理
一, get 请求
urllib3 主要使用连接池进行网络请求的访问, 所以访问之前我们需要创建一个连接池对象, 如下所示:
- import urllib3
- url = "http://httpbin.org"
- http = urllib3.PoolManager();
- r = http.request('GET',url+"/get")
- print(r.data.decode())
- print(r.status)
带参数的 get
- r = http.request('get','http://www.baidu.com/s',fields={'wd':'周杰伦'})
- print(r.data.decode())
经查看源码:
def request(self, method, url, fields=None, headers=None, **urlopen_kw):
第一个参数 method 必选, 指定是什么请求,'get','GET','POST','post','PUT','DELETE'等, 不区分大小写.
第二个参数 url, 必选
第三个参数 fields, 请求的参数, 可选
第四个参数 headers 可选
request 请求的返回值是
<urllib3.response.HTTPResponse object at 0x000001B3879440B8>
我们可以通过 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']
二, post 请求
- import urllib3
- url = "http://httpbin.org"
- fields = {
- 'name':'xfy'
- }
- http = urllib3.PoolManager()
- r = http.request('post',url+"/post",fields=fields)
- print(r.data.decode())
可以看到很简单, 只是第一个参数 get 换成了 post.
并且参数不需要再像 urllib 一样转换成 byte 型了.
三, 设置 headers
四, 设置代理
- import urllib3
- url = "http://httpbin.org"
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
- }
- proxy = urllib3.ProxyManager('http://101.236.19.165:8866',headers = headers)
- r = proxy.request('get',url+"/ip")
- print(r.data.decode())
五, 当请求的参数为 json
在发起请求时, 可以通过定义 body 参数并定义 headers 的 Content-Type 参数来发送一个已经过编译的 JSON 数据
- import urllib3
- url = "http://httpbin.org"
- import json
- data = {'name':'徐繁韵'}
- json_data = json.dumps(data)
- http = urllib3.PoolManager()
- r = http.request('post',url+"/post",body = json_data,headers = {'Content-Type':'application/json'})
- print(r.data.decode('unicode_escape'))
六, 上传文件
- # 元组形式
- with open('a.html','rb') as f:
- data = f.read()
- http = urllib3.PoolManager()
- r = http.request('post','http://httpbin.org/post',fields = {'filefield':('a.html',data,'text/plain')})
- print(r.data.decode())
- # 二进制形式
- r = http.request('post','http://httpbin.org/post',body = data,headers={'Content-Type':'image/jpeg'})
- print(r.data.decode())
七, 超时设置
- # 1 全局设置超时
- # http = urllib3.PoolManager(timeout = 3)
- # 2 在 request 里设置
- # http.request('post','http://httpbin.org/post',timeout = 3)
八, 重试和重定向
- import urllib3
- http = urllib3.PoolManager()
- # 重试
- r = http.request('post','http://httpbin.org/post',retries = 5) #请求重试测次数为 5 次 , 默认为 3ci
- print(r.retries) #Retry(total=5, connect=None, read=None, redirect=0, status=None)
- # 关闭重试
- http.request('post','http://httpbin.org/post',retries = False) #请求重试测次数为 5 次 , 默认为 3ci
- r = http.request('get','http://httpbin.org/redirect/1',redirect = False)
- print(r.retries)# Retry(total=3, connect=None, read=None, redirect=None, status=None)
- print(r.status)
- print(r.data.decode())
- print("--------------------")
- print(r.get_redirect_location())
- #302 不是异常
九, urllib3 本身设置了 https 的处理, 但是有警告
虽然可以请求, 但是报如下警告:
- InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
- InsecureRequestWarning)
禁用警告:
- import urllib3
- urllib3.disable_warnings() #禁用各种警告
- url = "https://www.12306.cn/mormhweb/"
- http = urllib3.PoolManager()
- r = http.request('get',url)
- print(r.data.decode())
urllib3 很强大, 但是并没有 requests 好用. 了解为主.
来源: http://www.jianshu.com/p/cc2b9e9ef28a