Python requests使用session登录后后续请求提示未登录如何解决
问题排查与解决方案
1. 先确认登录请求真的完成了凭证下发
- 校验登录POST请求的返回状态:打印
response.status_code和response.text,确认响应内容包含登录成功的标识(比如用户昵称、登录成功提示),而非隐形的校验失败提示 - 打印
session.cookies,确认服务器下发的登录凭证(如sessionid、JSESSIONID、auth_token等字段)确实被session对象存储
2. 补充后续请求的动态校验参数
大部分站点除登录接口外,后续所有POST请求都会要求携带新的CSRF令牌,你之前提取的csrf_token仅适用于登录接口,进入URL_2页面后站点会更新csrf凭证:
- 从
session.get(URL_2)的响应内容中提取新的csrf_token,可通过正则匹配页面meta标签、隐藏表单字段,或者从响应cookie中提取 - 把新的csrf_token加入后续POST请求的参数,或者请求头的
X-CSRFToken字段(根据站点实际规则调整)
3. 补全请求头的必要校验字段
- 补充
Referer头:POST提交到URL_2时,Referer值设为URL_2的页面地址,大部分站点会校验请求来源防止跨站伪造 - 确认
User-Agent头和浏览器一致,且全程保持统一,避免站点识别为自动化请求清空会话
4. 处理登录跳转逻辑
如果登录接口是302跳转逻辑,给登录POST请求添加allow_redirects=True参数,让session跟随跳转完成完整的登录流程,拿到最终的登录态cookie:
response = session.post(URL, login_data, headers=headers, allow_redirects=True)
调整后的示例代码
import requests import re session = requests.Session() # 统一请求头可以直接挂载到session,不用每次请求传 session.headers = { "User-Agent": "你的浏览器UA", "Referer": URL } # 登录页请求 response = session.get(URL) # 提取登录用csrf token = re.search(r'csrf_token" value="(.*?)"', response.text).group(1) login_data = {"username": '你的账号', "password": '你的密码', "csrf_token":token} # 提交登录,允许跳转 response = session.post(URL, data=login_data, allow_redirects=True) # 校验登录结果 if "欢迎" in response.text or "username" in response.text: print("登录成功") else: print("登录失败", response.text) exit() # 请求业务页 response = session.get(URL_2) # 提取业务页新的csrf new_csrf = re.search(r'csrf_token" value="(.*?)"', response.text).group(1) # 给业务请求头加Referer session.headers["Referer"] = URL_2 Data = {"csrf_token": new_csrf, "你要提交的其他字段": "值"} response = session.post(URL_2, data=Data) print(response.text)
内容的提问来源于stack exchange,提问作者wait3
相关产品推荐
相关产品推荐

