urllib3,一个超强的 Python 库!

urllib3,一个超强的 Python 库!

urllib3 是一个 Python 库,用于在请求 HTTP 协议时提供更高级的功能。它是一个增强型的 HTTP 客户端,主要用于可靠地发送请求和处理响应,简化了与 HTTP 协议交互的代码,且具有连接池、自动重试等高级功能。

本文将详细介绍 urllib3 的使用方法,涵盖基本的功能、用法示例、最佳实践,以及如何更好地处理 HTTP 请求和响应。


一、什么是 urllib3

urllib3 是一个 Python 的 HTTP 客户端库,它封装了标准库 urllib 的基础功能,使其更容易使用、更稳定、更高效。urllib3 提供了以下一些高级功能:

  1. 重用 TCP 连接:可以将多个请求重定向到同一个连接,以减少开销。
  2. 自动重试:处理请求失败时会自动重试,支持配置重试次数和重试延迟。
  3. 自定义请求超时:允许配置请求超时,避免请求卡住。
  4. 管理 SSL 证书:简化 HTTPS 请求的配置。
  5. 管理会话:允许配置请求头、Cookies 等请求参数。

二、安装 urllib3

urllib3 可以通过 pip 安装,使用以下命令:

pip install urllib3

三、使用 urllib3 发送 HTTP 请求

1. 发起一个 GET 请求

import urllib3

# 创建一个 HTTP 管理器
http = urllib3.PoolManager()

# 发起一个 GET 请求
response = http.request('GET', 'https://httpbin.org/get')

# 输出请求的状态码
print(response.status)

# 获取响应的 JSON 数据
data = response.data.decode('utf-8')
print(data)

在上面的代码中,我们使用 urllib3.PoolManager 创建了一个 HTTP 管理器,发送一个 GET 请求到 httpbin 网站。然后获取响应的状态码和响应的内容。

2. 发起一个 POST 请求

import urllib3
import json

# 创建一个 HTTP 管理器
http = urllib3.PoolManager()

# 请求的数据
data = {
    'name': 'John Doe',
    'age': 30
}

# 发送 POST 请求
response = http.request(
    'POST', 
    'https://httpbin.org/post', 
    headers={'Content-Type': 'application/json'}, 
    body=json.dumps(data)
)

# 输出请求的状态码
print(response.status)

# 获取响应的 JSON 数据
response_data = response.data.decode('utf-8')
print(response_data)

在这个示例中,我们通过 http.request 方法发送一个 POST 请求,传入请求头 Content-Type,并将请求的数据用 json.dumps 序列化为 JSON 格式。

3. 设置请求超时

import urllib3

# 创建一个 HTTP 管理器
http = urllib3.PoolManager()

# 设置请求超时
try:
    response = http.request('GET', 'https://httpbin.org/delay/5', timeout=2)
except urllib3.exceptions.TimeoutError:
    print("请求超时了!")

在这个示例中,我们设置了请求超时为 2 秒,如果请求时间超过 2 秒,则会触发 TimeoutError 异常。

4. 管理会话

urllib3 提供了 urllib3.PoolManager 的会话机制,可以在多个请求之间保持相同的连接池,减少连接的创建和销毁开销。

import urllib3

# 创建一个 HTTP 管理器
http = urllib3.PoolManager()

# 请求数据
params = {
    'name': 'John Doe',
    'age': 30
}

# 发送 GET 请求
response = http.request('GET', 'https://httpbin.org/get', fields=params)
print(response.data)

# 发送 POST 请求
data = {
    'email': 'john.doe@example.com',
    'password': 'securepassword'
}
response = http.request(
    'POST', 
    'https://httpbin.org/post', 
    fields=data
)
print(response.data)

通过上面的代码示例,使用 http.request 方法发送了一个 GET 请求和一个 POST 请求,两次请求共享了同一个连接池,这样可以提高连接效率。

四、处理重定向

urllib3 会自动处理 HTTP 重定向,比如 301、302 等。当我们发送一个请求时,如果目标资源发生了重定向,urllib3 会自动发起新请求。

import urllib3

# 创建一个 HTTP 管理器
http = urllib3.PoolManager()

# 发起一个 GET 请求,触发重定向
response = http.request('GET', 'https://httpbin.org/redirect/1')

# 获取最终的响应状态
print(response.status)

自定义重定向策略

可以通过传递 redirect 参数来自定义重定向策略:

import urllib3

# 创建一个 HTTP 管理器
http = urllib3.PoolManager(redirect=False)

# 自定义重定向
response = http.request('GET', 'https://httpbin.org/redirect/3')
print(response.status)  # 301等响应状态

五、自动重试

urllib3 可以自动重试请求,支持自定义重试策略。以下是如何使用 Retry 配置重试策略:

import urllib3
from urllib3.util.retry import Retry

# 创建一个 HTTP 管理器
http = urllib3.PoolManager()

# 配置重试策略
retry = Retry(
    total=3,  # 重试次数
    status_forcelist=[500, 502, 503, 504],  # 指定的状态码会重试
    backoff_factor=1  # 重试之间的时间延迟,单位秒
)

# 创建 HTTP 请求
http = urllib3.PoolManager(retries=retry)

# 发起 GET 请求
response = http.request('GET', 'https://httpbin.org/status/500')
print(response.data)

在这个示例中, Retry 配置了重试策略,如果响应状态码是 500502503504,那么 urllib3 会自动重试 3 次,每次之间的延迟为 1 秒。


六、总结

urllib3 是一个功能强大且高效的 Python HTTP 客户端库,支持 HTTP 连接池、自动重试、请求超时、重定向等高级功能。通过使用 urllib3,可以极大简化与 HTTP 协议交互的代码,避免手动管理连接和重试。

在实际使用中,urllib3 适用于各种场景,从简单的网页请求到复杂的 HTTP 协议处理,它都能轻松胜任。

通过本文的详细代码示例和图解说明,相信你已经掌握了 urllib3 的基本用法,能更高效地处理网络请求!

最后修改于:2024年11月26日 21:42

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日