Python中requests库的cookie问题求助

爬进一个网站,登录比较复杂所以打算用 selenium 得到 cookies,再用 requests 爬进去。 然而 selenium 保存的 cookie 格式是一个并列多个字典的一个列表

cookies=[{"domain": "xxxx", "httpOnly": true, "name": "JSESSIONID", "path": "/", "secure": false, "value": "asdsdsdsdsdsdsdsdsdsd"},...]

但是 requests 中 cookiejar 对象接受的是类似于{"JSESSIONID":"asdsdsdsdsdsdsdsdsdsd"}的字典,其余参数的添加需要使用 jar 的 set 方法,我使用了

for cookie in cookies:
	jar.set(cookie['name'],cookie['value'],domain=cookie['domain'],path=cookie['path'])

但是这样又有一个问题,有的 cookie 包含 expiry,有的不包含,jar.set 还不能这么写死了 我现在有个思路,怎么能够达到 cookie 这个字典里面有 expiry,就构造出来 expiry=cookie['expiry'],有 path 就构造出来相应的语句。 或者大家有更 pythonic 的解决方案? 先谢过大家了!感谢


Python中requests库的cookie问题求助

15 回复

求助…


问题分析: 你遇到的应该是requests.Session()自动管理cookie时,服务器返回的Set-Cookie没有被正确保存或后续请求没有携带的问题。最常见的原因是会话对象使用不当,或者服务器cookie有特殊限制(如HttpOnly、Secure、SameSite等)。

解决方案:Session对象保持会话是最佳实践。下面是一个完整示例,演示如何正确管理cookie:

import requests

# 创建会话对象(会自动保存和发送cookies)
session = requests.Session()

# 第一次请求:登录或获取初始cookie
login_url = 'https://example.com/login'
payload = {'username': 'test', 'password': 'test123'}
response1 = session.post(login_url, data=payload)

# 查看服务器返回的cookies
print("服务器返回的cookies:", response1.cookies.get_dict())

# 第二次请求:会话会自动携带之前收到的cookies
profile_url = 'https://example.com/dashboard'
response2 = session.get(profile_url)

# 查看当前会话保存的所有cookies
print("会话中保存的cookies:", session.cookies.get_dict())

# 手动添加/修改cookie(如果需要)
session.cookies.set('custom_cookie', 'value')

# 清除所有cookies
session.cookies.clear()

关键点:

  1. 使用Session对象:它会在整个会话期间自动保存和发送cookies,无需手动处理。
  2. 检查cookie属性:如果服务器设置了HttpOnly,Python无法直接读取;Secure要求HTTPS;SameSite可能影响跨域发送。
  3. 调试技巧:用response.headers查看原始Set-Cookie头,确认服务器确实返回了cookie。

一句话建议:用Session对象管理会话,检查服务器返回的cookie头。

没用过 requests,试试 eval,好像可行?
jar = requests.cookies.RequestsCookieJar()

eval(“jar.set(‘tasty_cookie’, ‘yum’, domain=‘xxx’, path=’/cookies’)”)
Out[14]: Cookie(version=0, name=‘tasty_cookie’, value=‘yum’, port=None, port_specified=False, domain=‘xxx’, domain_specified=True, domain_initial_dot=False, path=’/cookies’, path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={‘HttpOnly’: None}, rfc2109=False)

jar
Out[15]: <RequestsCookieJar[Cookie(version=0, name=‘tasty_cookie’, value=‘yum’, port=None, port_specified=False, domain=‘xxx’, domain_specified=True, domain_initial_dot=False, path=’/cookies’, path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={‘HttpOnly’: None}, rfc2109=False)]>

这个格式也不好调整,因为 jar.set 方法需要前两个参数是键和值,后面的是键=值,得遍历字典构造一个符合要求的字符串,写到这里觉得虽然也不是不行,但是还是有点繁…
最烦的是 requests 对于 cookie 其他参数不太重视,selenium 保存的 cookie 又比较完整,试了很多方法都不好
params 的话是加到 header 里面吧,但是获取的 cookie 有的是其他站的不需要的,cookiejar 能够自己选择,所以还是不太好…

我的意思是 动态参数 把参数写到一个 dict 里面 有些有 expiry 有些没有 不一定每次都传

比如 a = {‘ a ’: 1, ‘ b ’: 2} 再 foo(**a)

但是问题是这个 set 方法写死了前两个参必须是键值,后面可能可以用**,还是得遍历字典再用 if 组参数

直接 curl 转 python 吧 https://curl.trillworks.com

python<br>import requests<br><br>cookies=[<br> {"domain": "xxxx", "httpOnly": True, "name": "JSESSIONID", "path": "/", "secure": False, "value": "asdsdsdsdsdsdsdsdsdsd"}<br> # here: 你更多的 cookies-item,如果有的话<br>]<br>jar = requests.cookies.RequestsCookieJar()<br>for cookie in cookies:<br> cookie_name = cookie.pop('name', '')<br> cookie_value = cookie.pop('value', '')<br> if 'httpOnly' in cookie:<br> http_only = cookie.pop('httpOnly', None)<br> cookie['rest'] = {'HttpOnly': http_only}<br> jar.set(cookie_name, cookie_value, **cookie)<br>

v2ex 回复不支持 markdown?而且代码缩进也给整没了(无力…吐槽)

代码缩进被吃了,说明如下:
"if ‘httpOnly’ in cookie:"下面有 2 行
"for cookie in cookies:"下面的语句都在 for-in 里

谢谢!我试一下
谢谢,这个是个好东西,不过这个网站登陆的时候跳转很多,Chrome 就算 offline 也看不到请求,只能 fiddler 抓包,所以就打算直接 selenium 得到 cookie,再 requests 搞了

建议不要用 cookiejar 之类的来操作 cookie,直接从 response 里的 cookie-set 的 header 来获取信息,让然如果网站 cookie 设置非常特殊则另当别论。。

问题是用 requests 获取 cookie 很难,多次重定向和 js 生成参数,直接用 selenium 获取到了 cookie…

回到顶部