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问题求助
求助…
问题分析:
你遇到的应该是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()
关键点:
- 使用Session对象:它会在整个会话期间自动保存和发送cookies,无需手动处理。
- 检查cookie属性:如果服务器设置了
HttpOnly,Python无法直接读取;Secure要求HTTPS;SameSite可能影响跨域发送。 - 调试技巧:用
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)]>
**params
我的意思是 动态参数 把参数写到一个 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…


