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

