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

