You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python requests库多请求复用相同Cookie失败问题求助

如何在Requests中复用Cookie发起多个请求

首先,你遇到的问题其实是误解了r.cookies的含义——它只代表当前响应中服务器返回的Cookie,而不是当前会话中已保存的所有Cookie。不管是用Session还是手动传递cookies参数,你的Cookie其实已经被复用了,只是你没找对地方验证。

问题原因解析

  • 当你用requests.Session()时,Session对象会自动维护一个CookieJar,保存所有从服务器收到的Cookie,并在后续请求中自动带上。但r2.cookies只显示第二个请求的响应里服务器返回的Cookie,如果服务器在第二个请求中没有新的Cookie返回,它自然是空的。
  • 手动传递cookies=r1.cookies的方式也能让第二个请求带上第一个请求的Cookie,但同样,r2.cookies只是响应的Cookie,不是你发送的Cookie。

正确的实现与验证方式

方式1:使用Session(推荐)

Session是Requests中维护会话状态的最佳方式,它会自动处理Cookie的保存和携带。你需要打印Session对象的cookies来验证,而不是响应的cookies:

import requests

s = requests.Session()
# 第一个请求,Session会自动保存返回的Cookie
r1 = s.post("https://example.com/first.php", headers=headers1)
print("Session中的Cookie:", s.cookies)
print("第一个响应的Cookie:", r1.cookies)

# 第二个请求,Session会自动带上之前保存的Cookie
r2 = s.post("https://example.com/second.php", headers=headers1)
print("Session中的Cookie:", s.cookies)
print("第二个响应的Cookie:", r2.cookies)

此时你会看到Session中的Cookie在两个请求后始终包含PHPSESSID,说明Cookie已经被复用了。

方式2:手动传递Cookie

如果你不想用Session,需要确保在第二个请求中正确携带Cookie,同时可以通过查看请求的headers来验证Cookie是否被发送:

import requests

r1 = requests.post("https://example.com/first.php", headers=headers1)
print("第一个响应的Cookie:", r1.cookies)

# 手动构建Cookie字典,或者直接传递cookies参数
r2 = requests.post(
    "https://example.com/second.php",
    headers=headers1,
    cookies=r1.cookies
)
# 查看第二个请求的headers,确认Cookie是否被发送
print("第二个请求的Headers:", r2.request.headers)
print("第二个响应的Cookie:", r2.cookies)

r2.request.headers中你会看到Cookie字段,里面包含了PHPSESSID,说明请求已经带上了Cookie。

额外提示

如果你需要确认服务器是否接收到了Cookie,可以开启Requests的调试日志,查看完整的请求和响应内容:

import logging
import requests

logging.basicConfig(level=logging.DEBUG)
# 后续请求会打印详细的请求头、响应头信息

内容的提问来源于stack exchange,提问作者jozinko9

火山引擎 最新活动