Python Requests 操作 Cookie 的完整指南

Evan
Evan
发布时间:2026-10-11| 4人浏览过
原创

本文详细解析 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 会话池管理,配合正确的参数组合即可稳定完成身份校验流程。更多关于接口自动化测试与网络请求优化的资料,欢迎持续关注本站相关技术专栏!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。