Python Requests 操作 Cookie 的完整指南
本文详细解析 Python Requests 库中管理 Cookie 的多种实现方案。涵盖直接通过 headers 和 cookies 参数发送凭证、利用 Session 对象自动捕获响应头中的 Set-Cookie,以及通过字典赋值、set() 方法、RequestsCookieJar 对象和 utils 工具类进行精细化控制的实操代码。附带参数冲突处理建议,帮助开发者快速完成身份验证与会话保持功能。
直接请求传参:Headers 与 Cookies 参数
在单次 HTTP 请求中,可以通过 headers 或 cookies 参数直接向目标服务器携带 Cookie。两者底层均会转换为标准的 Cookie 请求头发送。
通过 Headers 参数拼接字符串
将多个 Cookie 以 cookie_name=cookie_value 的形式用分号拼接后,作为 Cookie 键的值传入 headers。
import requests
get_url = "https://postman-echo.com/get"
headers = {"Cookie": "cka=111a; ckb=111b"}
res = requests.get(url=get_url, headers=headers)
print(res.json().get("headers").get("cookie"))
print(res.request.headers.get("Cookie"))
终端输出结果一致,均为 cka=111a; ckb=111b,说明服务端成功接收并回显了自定义凭证。
通过 Cookies 参数传入字典
更推荐的方式是直接传入字典,Requests 会自动处理键值对的格式转换与编码。
import requests
get_url = "https://postman-echo.com/get"
cookies = {"cka": "222a", "ckb": "222b"}
res = requests.get(url=get_url, cookies=cookies)
print(res.json().get("headers").get("cookie"))
print(res.request.headers.get("Cookie"))
运行后将返回拼接后的 Cookie 字符串。需注意:当同时使用 headers 和 cookies 参数传递凭证时,Requests 内部会以 headers 为准,后者设置的 Cookie 将被忽略。
基于 Session 对象的会话级 Cookie 管理
对于需要保持登录状态或跨请求共享凭证的场景,应使用 requests.Session() 实例。同一 Session 发出的多次请求会自动继承已存储的 Cookie,大幅简化自动化脚本的维护成本。
第1步:初始化并观察自动缓存机制
新创建的 Session 对象内部 Cookie 为空。执行首次请求后,若服务器响应头中包含 Set-Cookie,Requests 会将其自动解析并存入当前会话的 Cookie 池中,后续请求无需手动添加即可携带该凭证。
import requests
session = requests.session()
print("会话初始 cookie:", dict(session.cookies))
get_url = "https://postman-echo.com/get"
res = session.get(url=get_url)
print("响应头 set-cookie:", res.headers.get("set-cookie"))
print("会话现有 cookie:", dict(session.cookies))
输出显示初始为空字典。响应获取到服务端生成的 sails.sid 令牌后,会话状态自动激活,后续访问相同域名接口时将自动带上此 Token。
第2步:字典键值直接注入
可直接对 session.cookies 进行索引赋值。此方法语法简洁,但**无法指定 Cookie 的作用域(Path、Domain)**,默认作用于当前请求上下文。
import requests
session = requests.session()
session.cookies["cka"] = "111a"
session.cookies["ckb"] = "111b"
get_url = "https://postman-echo.com/get"
res = session.get(url=get_url)
print("本次请求使用的 cookie:", res.request.headers.get("Cookie"))
第3步:使用 set() 方法指定作用域
当需要精确控制 Cookie 的生效范围时,调用 .set() 是最规范的途径。支持传入 path、domain、secure 等属性。
import requests
session = requests.session()
session.cookies.set("ck2", "222", path="/", domain="postman-echo.com")
get_url = "https://postman-echo.com/get"
res = session.get(url=get_url)
print("本次请求使用的 cookie:", res.request.headers.get("Cookie"))
print("会话现有 cookie:", session.cookies)
查看会话日志可确认带作用域标记:<Cookie ck2=222 for postman-echo.com/>,证明路径与域名策略已生效。
第4步:借助 RequestsCookieJar 对象批量更新
通过实例化空的 RequestsCookieJar,在其上配置好所有属性后,使用 .update() 合并至 Session。适合需要提前组装复杂 Cookie 数据的场景。
import requests
session = requests.session()
ckj = requests.sessions.RequestsCookieJar()
ckj.set('ck4a', '444a', path='/', domain='postman-echo.com')
session.cookies.update(ckj)
get_url = "https://postman-echo.com/get"
res = session.get(url=get_url)
print("本次请求使用的 cookie:", res.request.headers.get("Cookie"))
第5步:调用 requests.utils 工具类转换
若已有标准字典数据,可使用 cookiejar_from_dict() 快速转换为 Jar 对象并同步到会话。该方法同样不支持自定义 Path/Domain,适用于纯键值映射场景。
import requests
session = requests.session()
cookie_dict = {"ck5a": "555a", "ck5b": "555b"}
ckj5 = requests.utils.cookiejar_from_dict(cookie_dict=cookie_dict)
session.cookies.update(ckj5)
get_url = "https://postman-echo.com/get"
res = session.get(url=get_url)
print("本次请求使用的 cookie:", res.request.headers.get("Cookie"))
关键注意事项
在实际调试 HTTP 接口时,请牢记以下原则:
- 优先级覆盖规则:单次请求中,
headers['Cookie']的权重高于cookies参数,二者同传会导致后者静默失效。 - 作用域匹配:浏览器遵循严格的同源策略与路径匹配,Requests 虽较宽松,但若需模拟精准环境,务必使用
.set()指定domain。 - 动态令牌刷新:现代 Web 应用常通过 Set-Cookie 下发短期有效的 Session ID。使用 Session 对象可避免手动抓包提取与硬编码粘贴,保持脚本健壮性。
总结
以上就是 Python Requests 库中使用 Cookie 的详细方法与实战技巧的详细内容。根据是否需要在多请求间保持状态,灵活选择单次参数直传或 Session 会话池管理,配合正确的参数组合即可稳定完成身份校验流程。更多关于接口自动化测试与网络请求优化的资料,欢迎持续关注本站相关技术专栏!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













