当前位置: 首页 > 工具软件 > urllib3 > 使用案例 >

python Http客户端urllib3包使用

刘奇
2023-12-01

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

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

二、Urllib3 能通过pip来安装:

pip install urllib3

三、urllib3的使用:

1、request GET请求一

import urllib3
import requests
#  忽略警告:InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.
requests.packages.urllib3.disable_warnings()
# 一个PoolManager实例来生成请求, 由该实例对象处理与线程池的连接以及线程安全的所有细节
http = urllib3.PoolManager()
# 通过request()方法创建一个请求:
r = http.request('GET', 'http://cuiqingcai.com/')
print(r.status) # 200
# 获得html源码,utf-8解码
print(r.data.decode())

2、request  GET请求带参数和header

import urllib3
import requests

def testInterface():
    headers={'Content-Type':'application/json;charset=UTF-8','userId':'YWRtaW4='}
    http=urllib3.PoolManager();#然后你需要一个PoolManager实例来生成请求,由该实例对象处理与线程池的连接以及线程安全的所有细节,不需要任何人为操作:

    request=http.request('GET','http://localhost:9090/stationMain/getStationData',headers=headers,fields={})
    print(request.status)#200
    print(request.data.decode())#{"result":999,"data":{},"msg":"请登录。"}

testInterface()
header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'
    }
    r = http.request('GET',
             'http://www.baidu.com/s?',
             fields={'wd': 'hello'},
             headers=header)
    print(r.status) # 200
    print(r.data.decode())

3、post请求

#你还可以通过request()方法向请求(request)中添加一些其他信息,如:
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'
    }
    r = http.request('POST',
                     'http://httpbin.org/post',
                     fields={'hello':'world'},
                     headers=header)
    print(r.data.decode())
# 对于POST和PUT请求(request),需要手动对传入数据进行编码,然后加在URL之后:
encode_arg = urllib.parse.urlencode({'arg': '我的'})
print(encode_arg.encode())
r = http.request('POST',
                 'http://httpbin.org/post?'+encode_arg,
                 headers=header)
# unicode解码

print(r.data.decode('unicode_escape'))

4、发送json数据

#JSON:在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据:
import json
data={'attribute':'value'}
encode_data= json.dumps(data).encode()

r = http.request('POST',
                     'http://httpbin.org/post',
                     body=encode_data,
                     headers={'Content-Type':'application/json'}
                 )
print(r.data.decode('unicode_escape'))

5、上传文件

#使用multipart/form-data编码方式上传文件,可以使用和传入Form data数据一样的方法进行,并将文件定义为一个元组的形式     (file_name,file_data):
with open('1.txt','r+',encoding='UTF-8') as f:
    file_read = f.read()

r = http.request('POST',
                 'http://httpbin.org/post',
                 fields={'filefield':('1.txt', file_read, 'text/plain')
                         })
print(r.data.decode('unicode_escape'))

#二进制文件
with open('websocket.jpg','rb') as f2:
    binary_read = f2.read()

r = http.request('POST',
                 'http://httpbin.org/post',
                 body=binary_read,
                 headers={'Content-Type': 'image/jpeg'})
#
# print(json.loads(r.data.decode('utf-8'))['data'] )
print(r.data.decode('utf-8'))

6、使用Timeout

#使用timeout,可以控制请求的运行时间。在一些简单的应用中,可以将timeout参数设置为一个浮点数:
r = http.request('POST',
                 'http://httpbin.org/post',timeout=3.0)

print(r.data.decode('utf-8'))

#让所有的request都遵循一个timeout,可以将timeout参数定义在PoolManager中:
http = urllib3.PoolManager(timeout=3.0)

7、对重试和重定向进行控制

#通过设置retries参数对重试进行控制。Urllib3默认进行3次请求重试,并进行3次方向改变。
r = http.request('GET',
                 'http://httpbin.org/ip',retries=5)#请求重试的次数为5

print(r.data.decode('utf-8'))
##关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可:
r = http.request('GET',
                 'http://httpbin.org/redirect/1',retries=False,redirect=False)
print('d1',r.data.decode('utf-8'))
#关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可
r = http.request('GET',
                 'http://httpbin.org/redirect/1',redirect=False)

 类似资料: