requests 不自动清理过期 Cookie,需手动调用 clear_expired_cookies();其有效期由服务器通过 Expires/Max-Age 设置并转为 expires 时间戳存储,但仅在显式调用时检查并移除。

Python 3.11 中的 requests 库本身不主动管理 Cookie 的有效期,它只是按 HTTP 协议规范收发和存储 Cookie,有效期(Expires 或 Max-Age)由服务器设置、客户端(即 requests.Session)负责解析并记录,但不会自动清理过期 Cookie。
Cookie 有效期如何被识别和存储
requests 使用 http.cookiejar.Cookie 对象表示单个 Cookie,其中包含 expires(时间戳,单位秒)和 max_age 字段。当服务器在 Set-Cookie 响应头中提供 Expires=... 或 Max-Age=... 时,requests 会将其转换为 expires 时间戳(若两者同时存在,Max-Age 优先)。这个时间戳会被存入 Cookie 实例,但 requests 不会在每次请求前主动检查是否过期。
-
expires为None表示会话级 Cookie(浏览器关闭即失效),requests.Session也默认保留至 Session 对象销毁 - 即使 Cookie 已过期,只要它仍存在于
session.cookies中,requests默认仍会随请求发送(除非手动干预)
如何手动清理过期 Cookie
需显式调用 session.cookies.clear_expired_cookies()。该方法遍历所有 Cookie,对比当前时间与 expires 值,移除已过期的条目。
- 该方法无返回值,直接修改当前
CookieJar - 建议在关键请求前调用,例如:
session.cookies.clear_expired_cookies(); session.get(url) - 注意:它只清理
expires明确设置且已过期的 Cookie;对max_age未转为expires的情况(极少见)不生效
自定义 Cookie 管理策略(进阶)
如需更精细控制(比如定期清理、按域名过滤、或结合本地缓存持久化),可继承 requests.cookies.RequestsCookieJar 并重写 set 或 get_dict 方法,或在每次请求前后插入逻辑:
立即学习“Python免费学习笔记(深入)”;
- 覆盖
set方法,在存入前校验expires是否合理(如未来 30 天内) - 使用
session.hooks['response']注册回调,在收到响应后自动清理:lambda r, *a, **kw: r.request.session.cookies.clear_expired_cookies() - 若需持久化带有效期的 Cookie 到文件,可用
session.cookies.save()(需先启用DefaultCookiePolicy支持 expires 序列化)
常见误区提醒
不要误以为 requests 会像浏览器一样“自动过期”——它没有后台定时器,也不会跳过过期 Cookie 的发送。是否发送,取决于 Cookie 是否仍在 CookieJar 中;是否有效,则由服务端决定(多数服务端仍会接收但可能拒绝认证)。
- 调试时可用
print(session.cookies)或遍历session.cookies查看c.expires值 - 若发现登录态异常延续,大概率是过期 Cookie 未清理,或服务端未校验
Expires - 测试环境建议主动调用
clear_expired_cookies(),避免脏状态干扰


















