Python 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




