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

Python脚本请求JSON网页失败,求有效响应获取解决方案

解决JSONDecodeError:请求网页返回非JSON响应的问题

看起来你遇到的问题是调用res.json()时触发了JSONDecodeError,这说明服务器返回的内容根本不是有效的JSON格式——大概率是网站的反爬机制拦截了你的请求,返回了HTML验证页面/空内容,也可能是你的URL参数存在格式错误。

我给你一步步拆解解决办法:

第一步:先排查服务器实际返回的内容

先别着急解析JSON,先把响应的状态码和文本内容打出来,搞清楚服务器到底给了你什么:

import requests

# 先修复URL中的转义字符(把&换成&)
URL = "https://www.sandicormls.com/agent/AgentSearch?officeSortOption=name&_=1516998894917&_keywordsAll=&officeLocation=&sortOption=rndsrt&_keywordsAgentName=&page=&typeIn=Realtor%2CBroker%2COwner%2COffice+Manager%2CAppraiser&searchMode=agent&officeName="
res = requests.get(URL, headers={'User-Agent':'Mozilla/5.0'})

print("状态码:", res.status_code)
print("响应内容(前500字符):", res.text[:500])  # 只打印部分内容避免刷屏

如果返回403/401状态码,或者是带验证码、验证弹窗的HTML,那就是被反爬拦截了;如果返回空内容,大概率是参数格式不对。

第二步:修复URL的格式问题

你原来的URL里有&,这是HTML对&的转义字符,直接用这个URL会导致服务器错误解析参数,必须把所有&替换成实际的&,上面的代码已经帮你修正了这一点。

第三步:完善请求头,模拟真实浏览器

很多网站会检查不止User-Agent,还会验证Accept、Referer、X-Requested-With这些请求头,模拟真实浏览器的请求能大幅降低被拦截的概率,试试下面的完整代码:

import requests
import time
import json

# 生成动态时间戳(替换URL里的固定时间戳,更贴近真实请求)
timestamp = str(int(time.time() * 1000))
URL = f"https://www.sandicormls.com/agent/AgentSearch?officeSortOption=name&_={timestamp}&_keywordsAll=&officeLocation=&sortOption=rndsrt&_keywordsAgentName=&page=&typeIn=Realtor%2CBroker%2COwner%2COffice+Manager%2CAppraiser&searchMode=agent&officeName="

# 更完整的请求头,模拟Chrome浏览器的AJAX请求
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Referer': 'https://www.sandicormls.com/agent',
    'Accept-Language': 'en-US,en;q=0.9',
    'X-Requested-With': 'XMLHttpRequest'  # 关键头,标记这是AJAX请求
}

res = requests.get(URL, headers=headers)

# 先判断请求是否成功
if res.status_code == 200:
    try:
        data = res.json()
        print("获取到的JSON数据:", data)
    except json.JSONDecodeError:
        print("返回内容不是JSON,实际内容:", res.text)
else:
    print(f"请求失败,状态码:{res.status_code}")

额外提示

如果上面的方法还是不行,可能网站需要登录验证,或者用了JS渲染的反爬机制(比如Cloudflare验证),这时你可以尝试用selenium或playwright来模拟完整的浏览器加载流程,绕过JS验证。

内容的提问来源于stack exchange,提问作者SIM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:43:05