使用Python Requests维持会话:登录后GET请求无法获取数据的问题
解决GET请求返回HTML表单而非目标数据的问题
嘿,我之前对接API时也踩过一模一样的坑!你这种情况核心问题就是服务端没识别到GET请求的认证状态,下面分两种最常见的场景给你解决方案:
1. 未维持会话(Cookie认证场景)
很多网站用Session Cookie跟踪登录状态,如果你分开用requests.post()和requests.get(),这是两个完全独立的HTTP会话——POST登录拿到的Cookie不会自动带到GET请求里,服务端自然会认为你没登录,返回登录表单的HTML。
解决办法是用requests.Session()统一管理会话,它会自动帮你保存并携带Cookie:
import requests # 创建会话对象,自动处理Cookie的保存与携带 session = requests.Session() # 第一步:发送POST登录请求 login_payload = { "username": "你的用户名", "password": "你的密码" } login_res = session.post("https://目标网站/login", json=login_payload) # 确认登录成功(可打印响应或校验状态码) print("登录响应内容:", login_res.json()) assert login_res.status_code == 200, "登录请求失败,请检查账号密码或接口地址" # 第二步:用同一个会话发送GET请求 data_res = session.get("https://目标网站/api/目标数据接口") print("数据接口响应:", data_res.json())
2. 需要手动携带认证Token(JWT/Token认证场景)
如果API采用Token认证(比如JWT),POST登录返回的JSON里会包含一个token字段(常见字段名如access_token、token),这时候你需要在GET请求的请求头里主动带上这个Token,服务端才会识别你的身份。
示例代码:
import requests # 第一步:POST登录获取Token login_payload = { "username": "你的用户名", "password": "你的密码" } login_res = requests.post("https://目标网站/login", json=login_payload) login_data = login_res.json() # 提取Token(根据实际返回的字段名调整) access_token = login_data.get("access_token") if not access_token: raise ValueError("登录响应中未获取到有效Token,请检查接口文档") # 第二步:GET请求携带Token头 headers = { "Authorization": f"Bearer {access_token}", # 注意Bearer后面有一个空格 "Content-Type": "application/json" # 部分API需要指定此头 } data_res = requests.get("https://目标网站/api/目标数据接口", headers=headers) print("数据接口响应:", data_res.json())
额外排查点
- 确认POST登录请求的状态码是200/201,避免出现“返回带角色的JSON但实际未完成登录”的情况
- 部分网站会校验
User-Agent、Referer等请求头,你可以在GET请求中添加与POST一致的头信息,模拟浏览器请求 - 检查GET请求的URL是否正确,避免误访问到登录页面而非数据接口
内容的提问来源于stack exchange,提问作者Freddy A
相关产品推荐
相关产品推荐

