pip install urllib3

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性:

线程安全
连接池
客户端SSL/TLS验证
文件分部编码上传
协助处理重复请求和HTTP重定位
支持压缩编码
支持HTTP和SOCKS代理

安装:
Urllib3 能通过pip来安装:
$pip install urllib3


urllib3的使用:

生成请求(request):

   首先,你必须导入urllib3模块:

import urllib3

   然后你需要一个PoolManager实例来生成请求,由该实例对象处理与线程池的连接以及线程安全的所有细节,不需要任何人为操作:

https = urllib3.PoolManager()

   通过request()方法创建一个请求:

url = 'http://www.pipzj.com'
r = http.request('GET', url+"/")

   request()方法返回一个HTTPResponse对象。

   你还可以通过request()方法向请求(request)中添加一些其他信息,如:

# 带参数的get
rs = http.request('get','http://www.pipzj.com/?',fields={'p': 21})
print(rs.data.decode())

   请求(request)中的数据项(request data)可包括:

Headers:

rsp = http.request('get','http://www.pipzj.com/?',fields={'p': 21}, headers={'X-something':'values'})

一、get请求详细说明:

urllib3主要使用连接池进行网络请求的访问,所以访问之前我们需要创建一个连接池对象,如下所示:

import  urllib3

url = "http://pipzj.com"
http = urllib3.PoolManager();
r = http.request('GET',url+"/get")
print(r.data.decode())
print(r.status)

#带参数的get
r = http.request('get','http://www.pipzj.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>

二、post请求说明:

import  urllib3
url = "http://www.pipzj.com"
fields = {
's':'111'
}
http = urllib3.PoolManager()
r = http.request('post',url+"/post",fields=fields)
print(r.data.decode())

三、设置header属性

import  urllib3
url = "http://www.pipzj.com"
fields = {
's':'111'
}
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'
}
http = urllib3.PoolManager()
r = http.request('post',url+"/post",fields=fields,headers=headers)
print(r.data.decode())

四、设置代理

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)

五、json参数请求

import json
data = {'s':'111'}
json_data = json.dumps(data)
r = http.request('post',url+"/post",body = json_data,headers = {'Content-Type':'application/json'})

六、上传文件

#元组形式
with open('index.html','rb') as f:
data = f.read()
http = urllib3.PoolManager()
r = http.request('post','http://*******.com',fields = {'filefield':('index.html',data,'text/plain')})
print(r.data.decode())

#二进制形式

r = http.request('post','http://*******.com',body = data,headers={'Content-Type':'image/jpeg'})
print(r.data.decode())

七、超时设置

# 1全局设置超时
http = urllib3.PoolManager(timeout = 3)
# 2在request里设置
http.request('post','http://**********.com',timeout = 3)

八、重试和重定向

import urllib3
http = urllib3.PoolManager()
#重试
r = http.request('post','http://www.pipzj.com',retries = 5) #请求重试测次数为5次,默认为3次
print(r.retries) #Retry(total=5, connect=None, read=None, redirect=0, status=None)
#关闭重试
http.request('post','http://www.pipzj.com',retries = False) #请求重试测次数为5次 ,默认为3次

r = http.request('get','http://www.pipzj.com',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不是异常

九、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)

禁用警告:

urllib3.disable_warnings() #禁用各种警告

发表评论

您的电子邮箱地址不会被公开。