Python requests发送POST请求遇动态cookie返回400/403如何处理
核心问题
你当前代码的错误点如下:
- 已经使用
requests.Session()自动管理Cookie,却在请求头中硬写固定的Cookie值,覆盖了Session的自动维护逻辑,而浏览器的动态Cookie每次请求都会更新,固定值很快就会失效 - 没有预先请求登录页获取初始Cookie,绝大多数网站会在用户打开登录页时下发首次Cookie,登录请求必须携带该Cookie才会被服务端校验通过
- 大概率缺失登录页动态生成的校验参数(如CSRF Token、动态token等),这是返回403错误的常见原因
修复步骤
- 删除请求头中硬写的
Cookie字段,放开Session的自动Cookie管理能力 - 先发送GET请求访问登录页面,获取初始Cookie和页面内的动态隐藏参数
- 补全所有动态参数后,再发送POST登录请求
修正后代码示例
import requests # 提取页面动态参数可根据自己的技术栈选lxml、BeautifulSoup或者正则 from lxml import etree # 替换为你自己的站点地址 LOGIN_PAGE_URL = "https://example.com/login" LOGIN_POST_URL = "https://example.com/api/login" # 只保留固定请求头,移除Cookie字段 headers = { "User-Agent": "替换为你浏览器的真实User-Agent", "Referer": LOGIN_PAGE_URL, "Origin": "https://example.com" } base_post_data = { "user": "你的账号", "pass": "你的密码" } # 初始化Session,全程自动维护Cookie session = requests.Session() # 第一步:请求登录页获取初始Cookie和动态校验参数 login_page_resp = session.get(LOGIN_PAGE_URL, headers=headers) # 提取动态CSRF参数,具体的标签属性根据站点实际页面结构调整 html_dom = etree.HTML(login_page_resp.text) csrf_token = html_dom.xpath('//input[@name="csrf_token"]/@value')[0] # 把动态参数加入POST请求体 base_post_data["csrf_token"] = csrf_token # 第二步:发送登录请求 login_resp = session.post(LOGIN_POST_URL, data=base_post_data, headers=headers) print(login_resp.status_code) print(login_resp.text)
其他校验点
如果修改后仍返回400/403错误,可排查以下内容:
- 对比浏览器的登录请求参数,确认是否有其他动态生成的字段没有加入POST请求体
- 确认
User-Agent和浏览器完全一致,部分站点会校验UA合法性 - 如果站点存在前端JS动态生成Cookie的逻辑,无需硬啃JS逆向,可直接使用
selenium、playwright等浏览器自动化工具模拟登录规避校验
内容的提问来源于stack exchange,提问作者Elek Ross
相关产品推荐
相关产品推荐

