requests 通过 urllib3 发送 HTTP 请求,自身仅封装接口;默认启用连接池、SSL 验证和重定向,timeout 分连接与读取两阶段,Session 缓存连接池、Cookie 和请求头,response.content 为空常因状态码非 2xx 或响应体本为空。

requests 是怎么发 HTTP 请求的
requests 本身不处理底层网络通信,它把活儿全交给了 urllib3。你调用 requests.get(),实际是组装参数后丢给 urllib3.PoolManager.request() 执行。这意味着连接复用、重试、SSL 验证这些事,真正干活的是 urllib3,requests 只负责包装接口和默认行为。
- 默认启用连接池:同一个
Session发多次请求会复用 TCP 连接,避免重复握手开销 - SSL 验证默认开启:访问 HTTPS 站点时自动校验证书,失败直接抛
requests.exceptions.SSLError - 重定向默认跟随:最多 30 次跳转,超限抛
requests.exceptions.TooManyRedirects - 超时默认不设:不传
timeout参数就可能卡死,尤其在弱网或服务无响应时
Session 对象到底在缓存什么
Session 不是“记住登录态”的魔法盒子,它只缓存三样东西:连接池、Cookie、默认请求头。所谓“保持登录”,其实是服务器返回了 Set-Cookie,Session 自动存下来,后续请求再带上——仅此而已。
- Cookie 存在内存里,不是持久化存储:程序退出就丢,别指望它跨进程或跨启动生效
- 连接池按 host + port 分桶:访问
<a href="https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39">https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39</a>和<a href="https://www.php.cn/link/2f7eaf16eceec07fc19c93090e90033a">https://www.php.cn/link/2f7eaf16eceec07fc19c93090e90033a</a>是两个独立池 - 默认 User-Agent 是
python-requests/2.x.x:有些 API 会拦截这个 UA,需手动设headers={'User-Agent': 'xxx'}
timeout 参数为什么总让人困惑
timeout 不是一个值,而是两个阶段的上限:(connect_timeout, read_timeout)。只传一个数字(如 timeout=5),它只控制连接建立时间,读响应仍可能无限卡住。
Python 环境工具专业版功能概述Python 环境工具专业版是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。执行完成后建议检查结果是否符合预期,并保留必要记录。使用与执行同时注意输入完整性、执行条件和输出可用性。从功能定位来看,该技能
-
timeout=5:连接必须 5 秒内建好,但服务器发回数据花 60 秒也不会超时 -
timeout=(3, 10):3 秒连不上就报错;连上了,但 10 秒内没收到完整响应也报错 - 设成
timeout=None或不设:读阶段彻底放弃超时控制,遇到挂起的服务就一直等 - 常见错误现象:
requests.get(url)卡住不动 → 八成是漏了read_timeout
为什么有时候 response.content 是空的
response.content 是原始字节,response.text 是解码后的字符串。空 content 通常不是没数据,而是响应体确实为空(比如 204 No Content),或者你误读了 response.status_code 就直接取内容。
立即学习“Python免费学习笔记(深入)”;
- 状态码非 2xx 时,很多 API 返回空 body,但
response.content仍是b'',不是报错 -
response.text在编码未知时会 fallback 到 ISO-8859-1,可能导致乱码,别无脑信它 - 流式下载场景下,如果用了
stream=True,response.content会触发整个 body 加载进内存,大文件慎用
HTTP 协议细节、SSL 握手过程、DNS 解析这些,requests 全部透传给底层库,它自己没实现任何网络栈。想调优性能或排查超时,得顺着 urllib3 和系统 socket 层去看。
















