Python批量请求需用Session复用连接、ThreadPoolExecutor并发、分层捕获异常并统一收口结果。关键包括:连接池调优、线程安全复用Session、按错误类型重试、结构化存储成败结果。

Python调用接口时,批量请求和异常处理是提升稳定性和效率的关键。单纯用requests.get()逐个发请求,既慢又容易崩——尤其面对几十上百个URL时。核心思路就两条:并发控制 + 稳健容错。
每次新建requests.get()都会重建TCP连接、TLS握手,耗时明显。换成Session对象,能自动复用底层连接,尤其适合批量请求同一域名的场景。
说明:
- Session会缓存连接池,默认保持10个空闲连接;
- 同一Session发出的请求,若Host相同,大概率复用已有连接;
- 配合mount可为HTTP/HTTPS定制Adapter(比如设置最大连接数)。
建议写法:
import requests
<p>session = requests.Session()</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p><h1>可选:调整连接池大小(避免TooManyRedirects或ConnectionPoolSizeError)</h1><p>adapter = requests.adapters.HTTPAdapter(pool_connections=20, pool_maxsize=20)
session.mount('http://', adapter)
session.mount('https://', adapter)</p><p>urls = ['<a href="https://www.php.cn/link/cf24f44a79866351337c1b317ffdc18d">https://www.php.cn/link/cf24f44a79866351337c1b317ffdc18d</a>', '<a href="https://www.php.cn/link/abc58d2523df2aea708a509fbd201437">https://www.php.cn/link/abc58d2523df2aea708a509fbd201437</a>']
for url in urls:
try:
resp = session.get(url, timeout=5)
resp.raise_for_status()
print(resp.json())
except requests.exceptions.RequestException as e:
print(f"请求失败 {url}:{e}")
多数业务接口是IO密集型,用多线程比多进程更轻量,也比手写async更易维护。Python标准库concurrent.futures.ThreadPoolExecutor足够应对几百以内的并发量。
Hugging Face
Hugging Face AI开源社区
270
查看详情
关键点:
- 控制max_workers(通常设为CPU核数×2~5,或根据目标服务器承载力调低);
- 每个worker内仍用Session,避免连接池竞争;
- 用as_completed实时获取结果,不阻塞等待全部完成。
示例结构:
from concurrent.futures import ThreadPoolExecutor, as_completed
<p>def fetch_one(session, url):
try:
resp = session.get(url, timeout=8)
resp.raise_for_status()
return {'url': url, 'status': 'success', 'data': resp.json()}
except Exception as e:
return {'url': url, 'status': 'error', 'error': str(e)}</p><h1>复用Session实例(注意:Session不是线程安全的,但用于GET基本无问题;如需绝对安全,可在每个worker里新建)</h1><p>with ThreadPoolExecutor(max_workers=10) as executor:
futures = [executor.submit(fetch_one, session, url) for url in urls]
for future in as_completed(futures):
result = future.result()
if result['status'] == 'success':
print("✅", result['url'])
else:
print("❌", result['url'], result['error'])
接口请求失败原因多样,统一用一个except Exception掩盖细节,调试和重试策略都会失效。应按错误类型分层处理:
ConnectionError、Timeout——适合立即重试(加退避);HTTPError(4xx/5xx)——4xx一般不重试,5xx可考虑重试;JSONDecodeError——说明返回非预期格式(可能是HTML错误页),需记录原始resp.text排查;{"code": 4001, "msg": "余额不足"}——属于正常业务流,不应进except,而应在response后判断字段。推荐做法:封装一个带基础重试和分类日志的请求函数:
import time
import logging
from requests.exceptions import ConnectionError, Timeout, HTTPError
<p>def safe_get(session, url, max_retries=2, backoff_factor=1):
for i in range(max_retries + 1):
try:
resp = session.get(url, timeout=10)
resp.raise_for_status()
return resp
except ConnectionError:
if i == max_retries:
raise
logging.warning(f"连接失败 {url},{backoff_factor * (2 <strong> i)}s后重试")
time.sleep(backoff_factor * (2 *<em> i))
except Timeout:
if i == max_retries:
raise
logging.warning(f"超时 {url},重试中...")
time.sleep(backoff_factor </em> (2 </strong> i))
except HTTPError as e:
if resp.status_code >= 500 and i < max_retries:
logging.warning(f"服务端错误 {url}({resp.status_code}),重试...")
time.sleep(backoff_factor * (2 ** i))
continue
raise # 4xx直接抛出
批量请求的目标不是“全成功”,而是“可知可控”——哪怕100个里失败20个,也要明确知道哪20个、为什么失败、返回什么原始信息。
建议:
- 结果用字典或命名元组存储,含url、status('success'/'failed')、response(成功时为json dict,失败时为exception或原始resp);
- 失败项单独写入log文件或数据库,包含url、timestamp、error_type、error_msg、response_text(如有);
- 最终汇总打印成功数/失败数/平均耗时,方便快速评估批次质量。
不复杂但容易忽略。
以上就是Python接口请求如何优化_批量请求与异常处理技巧【教学】的详细内容,更多请关注其它相关文章!
# html
# python
# 重试
# red
# 为什么
# 标准库
# 并发请求
# python接口
# ai
# session
# json
# js
# 沛县手机网站建设
# 网站建设步骤及推广方法
# 龙南seo网络营销
# 郴州网站建设和优化
# 濮阳本地网站推广公司
# 北京加工网站建设收费
# 钙尔奇营销推广2016
# 厦门seo顾问
# 济南网站建设服务收费
# 网站建设古蔺
# 相关文章
# 设为
# 已有
# 如有
# 也要
# 第三方
# 多线程
# 连接池
# 复用
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
CSS如何控制元素外边距_margin实现布局间隔
windows10怎么关闭自动安装应用_windows10禁止推广应用下载
电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法
知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法
《爱笔思画x》魔棒工具抠图教程
Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】
我的世界游戏平台入口 我的世界官方官网直达链接
Go语言中方法与接收器:指针和值类型的调用机制详解
win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】
qq邮箱怎么注册_QQ邮箱注册步骤与注意事项
稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口
《下一站江湖2》心法融合技巧
《下一站江湖2》大雪山加入方法
PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素
QQ邮箱注册地址 免费获取QQ邮箱账号
如何查询个人病历记录
百度竞价WAP显示PC链接问题
实时数据流中高效查找最小值与最大值
为什么XML解析器对大小写敏感? 理解XML规范中的大小写规则与最佳实践
163邮箱网页版入口 163邮箱在线使用
《顺丰同城骑士》查看我的技能方法
Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例
OPPO A3 WiFi频繁断开怎么办 OPPO A3网络优化技巧
从HTML表单获取逗号分隔值并转换为NumPy数组进行预测
QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务
小红书如何引流到私信?引流到私信有用吗?
哔哩哔哩在线观看入口 B站官网免费进入
J*aScript模拟悬停与点击:自动化网页动态元素交互指南
PHP页面重载时变量值不重置的实现方法
创客贴登录页面入口 创客贴网页版最新网址链接
胃动力不足?试试这5个调理方法
汽水音乐官方网站登录入口_汽水音乐网页版进入链接
处理含命名空间的XML文件 Power Query中的高级技巧
如何使用 composer 和 aop-php 实现 AOP 编程?
《随手记》启用语音备注方法
Eclipse开发J*a快速入门
深入理解J*aScript异步操作:setTimeout与调用栈的真相
如何编写一个符合 composer 规范的 post-install-cmd 脚本?
sublime如何撤销关闭的标签页_sublime重新打开已关闭文件技巧
Python对象引用与属性赋值:理解链表中的行为
WPS文字如何进行简繁转换
J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践
口腔诊所管理软件推荐
济南公交卡手机充值指南
豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】
猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程
123网页端官方登录页 123邮箱网页版即时通讯服务
SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱
海棠阅读登录教程_详细讲解海棠登录操作
mysql如何管理数据库账户_mysql数据库账户管理技巧
2025-12-18
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。