You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:58:13