Python利用urllib3库发送请求的完全指南

 更新时间:2026年06月16日 09:21:22   作者:detayun  
urllib3 是 Python 中最流行的 HTTP 客户端库之一,本文全面介绍了PythonHTTP客户端库urllib3的核心用法,对比了其与内置urllib和requests的优势,重点突出连接池和线程安全特性,希望对大家有所帮助

urllib3 是 Python 中最流行的 HTTP 客户端库之一,相比内置的 urllib,它更简洁、更强大、更易用。本文从零开始,覆盖日常开发中 90% 的请求场景。

一、为什么选 urllib3?

对比项urllib(内置)requests(第三方)urllib3
上手难度较高极低
连接池需手动管理内置内置(核心优势)
线程安全
性能一般一般更优

requests 底层其实就是用 urllib3 实现的。学会 urllib3,等于理解了 requests 的内核。

二、安装

pip install urllib3

三、GET 请求 —— 最基础的用法

import urllib3

http = urllib3.PoolManager()  # 创建连接池(推荐)

resp = http.request('GET', 'https://httpbin.org/get')
print(resp.status)        # 200
print(resp.data)          # b'{"args":{}, ...}'
print(resp.headers)       # 响应头

关键点

  • PoolManager() 内部维护连接池,复用 TCP 连接,性能远好于每次新建连接
  • 响应数据是 bytes,需要解码:resp.data.decode('utf-8')

四、带参数的 GET 请求

resp = http.request(
    'GET',
    'https://httpbin.org/get',
    fields={'key': 'value', 'page': 1}  # 自动拼接 ?key=value&page=1
)
print(resp.data.decode('utf-8'))

等价于手动拼接 URL:

from urllib.parse import urlencode
url = 'https://httpbin.org/get?' + urlencode({'key': 'value'})

但用 fields 更安全,urllib3 会自动处理编码,避免特殊字符导致的问题。

五、POST 请求 —— 三种常见场景

5.1 表单提交(application/x-www-form-urlencoded)

resp = http.request(
    'POST',
    'https://httpbin.org/post',
    fields={'username': 'admin', 'password': '123456'}
)

5.2 JSON 提交(application/json)

import json

resp = http.request(
    'POST',
    'https://httpbin.org/post',
    body=json.dumps({'username': 'admin'}),
    headers={'Content-Type': 'application/json'}
)

5.3 上传文件(multipart/form-data)

with open('photo.jpg', 'rb') as f:
    resp = http.request(
        'POST',
        'https://httpbin.org/post',
        fields={'file': ('photo.jpg', f, 'image/jpeg')}
    )

格式:('文件名', 文件对象, 'MIME类型')

六、自定义请求头

resp = http.request(
    'GET',
    'https://api.example.com/data',
    headers={
        'User-Agent': 'my-app/1.0',
        'Authorization': 'Bearer xxxxxxx'
    }
)

常见坑User-Agent 必加,否则很多接口会直接拒绝(尤其是反爬场景)。

七、超时设置(生产环境必加)

resp = http.request(
    'GET',
    'https://httpbin.org/delay/5',
    timeout=3.0  # 3秒超时,超时抛出 urllib3.exceptions.TimeoutError
)

也可以分别设置连接超时和读取超时:

resp = http.request(
    'GET',
    'https://example.com',
    timeout=(3.0, 10.0)  # (连接超时, 读取超时)
)

八、异常处理 —— 别让程序崩溃

import urllib3
from urllib3.exceptions import HTTPError, TimeoutError, MaxRetryError

http = urllib3.PoolManager(retries=3)  # 自动重试3次

try:
    resp = http.request('GET', 'https://httpbin.org/status/500')
    resp.raise_for_status()  # 非200状态码抛出 HTTPError
except TimeoutError:
    print('请求超时')
except HTTPError as e:
    print(f'HTTP错误: {e.response.status}')
except MaxRetryError:
    print('重试次数耗尽')

最常用的三个异常

异常触发场景
TimeoutError超时未响应
HTTPError非 2xx 状态码
MaxRetryError重试耗尽仍失败

九、进阶:连接池复用(性能关键)

http = urllib3.PoolManager(
    num_pools=10,          # 最大连接池数量
    maxsize=10,            # 每个池最大连接数
    retries=3,             # 自动重试次数
    timeout=5.0
)

# 复用同一个 http 对象发送多个请求
r1 = http.request('GET', 'https://api.example.com/users')
r2 = http.request('GET', 'https://api.example.com/orders')

千万不要每次请求都 urllib3.PoolManager(),那等于每次都新建连接池,失去了 urllib3 最大的性能优势。

十、完整实战示例:调用一个 REST API

import urllib3
import json

http = urllib3.PoolManager(timeout=10.0, retries=3)

def call_api(endpoint, data=None, method='GET'):
    url = f'https://api.example.com{endpoint}'
    
    kwargs = {
        'method': method,
        'headers': {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer your_token_here'
        }
    }
    
    if data:
        kwargs['body'] = json.dumps(data)
    
    try:
        resp = http.request(url, **kwargs)
        resp.raise_for_status()
        return resp.data.decode('utf-8')
    except urllib3.exceptions.HTTPError as e:
        print(f'API返回错误: {e.response.status} - {e.response.data}')
        return None
    except urllib3.exceptions.TimeoutError:
        print('请求超时')
        return None

# 调用
result = call_api('/users', data={'name': 'zhangsan'}, method='POST')
print(result)

总结:速查表

需求核心参数
GET 请求http.request('GET', url)
带参数 GETfields={'k': 'v'}
POST 表单fields={'k': 'v'}
POST JSONbody=json.dumps(data), headers={'Content-Type': 'application/json'}
上传文件fields={'file': ('name', fp, 'type')}
自定义头headers={'Key': 'Value'}
超时timeout=3.0
自动重试PoolManager(retries=3)

urllib3 不花哨,但足够可靠。掌握以上内容,日常接口调用绰绰有余。

到此这篇关于Python利用urllib3库发送请求的完全指南的文章就介绍到这了,更多相关Python urllib发送请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python引用传值概念与用法实例小结

    Python引用传值概念与用法实例小结

    这篇文章主要介绍了Python引用传值概念与用法,简单分析了Python引用传值的概念、功能并结合实例形式总结分析了Python引用传值的具体实现与使用方法,需要的朋友可以参考下
    2017-10-10
  • 将Pytorch模型从CPU转换成GPU的实现方法

    将Pytorch模型从CPU转换成GPU的实现方法

    今天小编就为大家分享一篇将Pytorch模型从CPU转换成GPU的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python+pyecharts绘制交互式可视化图表

    Python+pyecharts绘制交互式可视化图表

    本文我们来了解一个新的可视化模块pyecharts,并且利用该模块绘制让数据变成优美的交互式可视化图表,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-04-04
  • Python 安装和配置flask, flask_cors的图文教程

    Python 安装和配置flask, flask_cors的图文教程

    这篇文章主要介绍了Python 安装和配置flask, flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用

    python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用

    这篇文章主要介绍了python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Python 用户输入和字符串格式化示例详解

    Python 用户输入和字符串格式化示例详解

    Python 允许用户输入数据。这意味着我们可以向用户询问输入,这篇文章主要介绍了Python 用户输入和字符串格式化指南,以下示例要求用户输入用户名,并在输入用户名后将其打印在屏幕上,需要的朋友可以参考下
    2023-11-11
  • miniconda3介绍、安装以及使用教程

    miniconda3介绍、安装以及使用教程

    Miniconda是一款小巧的python环境管理工具,安装包大约只有50M多点,其安装程序中包含conda软件包管理器和Python,下面这篇文章主要给大家介绍了关于miniconda3介绍、安装以及使用的相关资料,需要的朋友可以参考下
    2023-02-02
  • 在OpenCV里使用Camshift算法的实现

    在OpenCV里使用Camshift算法的实现

    这篇文章主要介绍了在OpenCV里使用Camshift算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • python 获取当天凌晨零点的时间戳方法

    python 获取当天凌晨零点的时间戳方法

    今天小编就为大家分享一篇python 获取当天凌晨零点的时间戳方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 在Django中创建动态视图的教程

    在Django中创建动态视图的教程

    这篇文章主要介绍了在Django中创建动态视图的教程,Django是Python重多人气框架中最为著名的一个,需要的朋友可以参考下
    2015-07-07

最新评论