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
相关产品推荐
相关产品推荐

