如何在Python的requests模块中实现类似curl的跨请求Cookie复用及CookieJar更新
嘿,我来帮你搞定这个问题!你用curl的时候,-c cookie_jar是把请求返回的Cookie保存到文件,-b cookie_jar是从文件加载Cookie用于后续请求,同时第二个请求还会用-c cookie_jar更新这个文件里的Cookie。在Python的requests模块里,我们用**requests.Session()对象**就能轻松实现一模一样的效果——它会自动维护一个CookieJar,跨请求自动携带、更新Cookie;如果需要像curl那样持久化到文件,也有对应的方法。
情况1:同一程序内跨请求复用Cookie(无需文件)
这种场景下,Session对象就像你的浏览器会话,所有通过它发送的请求都会共享同一个CookieJar,完全不用手动处理Cookie的保存和加载,比curl更省心:
import requests # 创建Session对象,它会自动帮你维护CookieJar session = requests.Session() # 1. 对应第一个curl登录请求(-c cookie_jar) login_url = "https://example.com/api/wealth/mobile/auth/login" login_headers = { "api-key": "qweqwexxc123ewervdssdf", "request-id": "login", "Content-Type": "application/json" } login_data = { "locale": "en", "signinId": "xxxx@gmail.com", "password": "xxxxxx", "remembered": "false", "trueIP": "192.168.0.1" } # 发送登录请求,Session会自动保存返回的Cookie到内部的CookieJar login_response = session.post(login_url, headers=login_headers, json=login_data) login_response.raise_for_status() # 可选:检查请求是否成功,失败则抛出异常 # 2. 对应第二个curl的MFA验证请求(-b cookie_jar -c cookie_jar) mfa_url = "https://example.com/api/wealth/mobile/mfa/evaluatemfa" mfa_headers = { "request-id": "mfa-evaluate" # 根据实际需求添加headers } mfa_data = { # 这里填写你的MFA验证数据,比如验证码、设备信息等 } # 发送MFA请求,Session会自动携带之前保存的Cookie,请求完成后还会自动更新CookieJar mfa_response = session.post(mfa_url, headers=mfa_headers, json=mfa_data) mfa_response.raise_for_status()
情况2:持久化Cookie到文件(和curl的-c/-b完全对应)
如果需要把Cookie保存到文件(比如重启程序后不用重新登录),可以用http.cookiejar.MozillaCookieJar,它直接支持读写curl格式的cookie文件:
import requests from http.cookiejar import MozillaCookieJar # 初始化一个MozillaCookieJar,对应curl的cookie_jar文件 cookie_jar = MozillaCookieJar("cookie_jar") # 创建Session并绑定这个CookieJar session = requests.Session() session.cookies = cookie_jar # 1. 登录并保存Cookie到文件(对应curl -c cookie_jar) login_url = "https://example.com/api/wealth/mobile/auth/login" login_headers = { "api-key": "qweqwexxc123ewervdssdf", "request-id": "login", "Content-Type": "application/json" } login_data = { "locale": "en", "signinId": "xxxx@gmail.com", "password": "xxxxxx", "remembered": "false", "trueIP": "192.168.0.1" } login_response = session.post(login_url, headers=login_headers, json=login_data) login_response.raise_for_status() # 保存Cookie到文件,ignore_discard=True保存临时Cookie,ignore_expires=True覆盖旧Cookie cookie_jar.save(ignore_discard=True, ignore_expires=True) # 2. 加载Cookie并发送MFA请求,同时更新Cookie文件(对应curl -b cookie_jar -c cookie_jar) # 如果是在另一个会话中使用,先加载Cookie文件: # cookie_jar.load("cookie_jar", ignore_discard=True, ignore_expires=True) mfa_url = "https://example.com/api/wealth/mobile/mfa/evaluatemfa" mfa_headers = { "request-id": "mfa-evaluate" } mfa_data = { # 你的MFA验证数据 } mfa_response = session.post(mfa_url, headers=mfa_headers, json=mfa_data) mfa_response.raise_for_status() # 再次保存更新后的Cookie到文件 cookie_jar.save(ignore_discard=True, ignore_expires=True)
小提示
- 如果你只是在同一个程序里连续发送请求,用第一种
Session自动管理的方式就足够了,简洁高效。 ignore_discard=True和ignore_expires=True的作用和curl的行为一致:保存那些没有设置过期时间的临时Cookie,并且覆盖文件中已存在的Cookie条目。
备注:内容来源于stack exchange,提问作者devops-admin
相关产品推荐
相关产品推荐

