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

Python requests发POST请求返回text/html但Chrome DevTools显示JSON响应

可行解决方案

  • 首先明确:你手动修改响应头的操作无法解决问题,该操作仅修改本地响应对象的头属性,实际服务端返回的内容本身就是HTML,无法强行解析为JSON,核心解决方向是对齐你发的请求和Chrome DevTools中请求的所有参数,让服务端返回正确的JSON内容。

步骤1:完整对齐请求头

不要仅设置Content-Type和Accept,要把Chrome DevTools中对应请求的全部请求头复制到你的代码中,核心需要关注的头包括:

  • User-Agent:防止被服务端识别为爬虫
  • Referer:很多服务端会校验请求来源
  • Cookie:校验登录状态、会话标识
  • X-Requested-With: XMLHttpRequest:多数后端用来判断是否为AJAX请求,未携带时默认返回HTML页面
    示例代码:
import requests

headers = {
    "User-Agent": "你从DevTools复制的UA",
    "Referer": "你从DevTools复制的来源页地址",
    "X-Requested-With": "XMLHttpRequest",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Content-Type": "和DevTools中一致的Content-Type",
    "Cookie": "你从DevTools复制的Cookie"
}

response = requests.post("你的接口地址", headers=headers, data=你的请求参数)

全部带上后如果请求正常,可以逐个删除头字段,定位出是哪个字段影响了返回结果。

步骤2:对齐会话状态

如果直接发POST请求无响应,用requests.Session()维持会话连贯性,多数网站要求先访问首页获得基础Cookie后,才允许调用接口:

session = requests.Session()
# 先请求目标网站首页,获取初始Cookie
session.get("https://目标网站的首页地址", headers=headers)
# 再用同一个session发POST请求
response = session.post("你的接口地址", headers=headers, data=你的请求参数)

步骤3:校验请求参数

完全对齐DevTools中该POST请求携带的所有参数:

  • 检查是否遗漏csrf token、token等校验参数,这类参数通常在首页HTML、Cookie或者前置接口中返回,需要动态获取后带入POST请求
  • 如果是multipart/form-data格式的请求,不要手动设置Content-Type头,让requests自动生成边界值,手动设置的边界值和实际参数不匹配会导致服务端解析失败,返回错误页

步骤4:排查返回的HTML内容

如果以上操作都无效,先打印完整的响应HTML内容,判断是否是以下场景:

  • 登录提示页:说明Cookie失效,需要更新或动态获取Cookie
  • 验证码/反爬拦截页:说明被反爬策略拦截,可尝试更换代理、修改TLS指纹,或使用playwright等模拟浏览器工具发起请求
  • 错误提示页:查看HTML中的错误信息,定位参数、权限问题

内容的提问来源于stack exchange,提问作者leila-m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:21:03