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

Python代码请求特定URL报JSON解码错误、其他URL正常的原因及修复

代码触发JSON解码错误的核心原因
  • 报错的本质是代码拿到HTTP响应后,直接将响应内容传入JSON解析器,但传入的内容不符合合法JSON格式。这和“请求其他URL可正常运行”不存在矛盾,问题仅出在和当前目标URL的交互链路中,具体诱因包括三类:
    • 目标服务端实际返回的不是JSON数据:常见场景包括服务端返回4xx/5xx错误的HTML占位页、WAF或反爬逻辑拦截请求后返回提示文本、接口传输中断返回截断的不完整内容,这类内容都无法被JSON解析器识别
    • 代码缺少基础校验逻辑:发送请求后没有校验响应状态码、响应内容类型,默认假设所有响应都是合法JSON,没有任何兜底判断,只要服务端返回非预期内容就会直接触发解码错误
    • 请求本身被服务端拦截:目标服务端可能会校验请求头信息,没有携带常规浏览器User-Agent的请求会被拦截,返回非JSON的拦截提示,进而触发解码异常

注意:该问题不代表目标URL本身永久失效,很多时候是服务端临时故障、反爬拦截导致返回内容不符合预期,并非URL完全不可用。

可落地的修复方案
  • 替换手动解析文本的逻辑:使用requests内置的response.json()方法替代手动调用json.loads(response.text),该方法可以自动适配响应自带的编码格式,减少因编码不匹配导致的解析错误
  • 增加基础校验与兼容逻辑:
    • 请求时补全常规浏览器请求头、设置合理超时时间,降低被服务端反爬规则拦截的概率
    • 解析前先通过response.raise_for_status()校验HTTP响应状态,非2xx状态的响应直接抛出明确的HTTP错误,而不是走到JSON解析步骤暴露模糊的解码错误
  • 增加调试定位逻辑:如果依然出现解析错误,在解析前打印响应的原始内容、响应状态码、响应头中的Content-Type字段,直接确认服务端返回的实际内容,快速定位问题来源
  • 优化后的可直接运行代码示例:
import requests

def get_quote():
    # 补全常规请求头,降低被拦截概率
    request_headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
    }
    response = requests.get(
        "http://kitkabackend.eastus.cloudapp.azure.com:5010/highscore/crowns/list?Country=GB&start=0&count=1",
        headers=request_headers,
        timeout=10
    )
    # 校验HTTP响应状态,非2xx状态直接抛出明确异常
    response.raise_for_status()
    # 调用requests内置方法解析JSON
    json_data = response.json()
    quote = str(json_data["scores"][0]["User"]["Crowns"])
    return quote

quote = get_quote()
print(quote)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 13:15:04