使用BeautifulSoup爬取Zillow房产数据遇JSON解析错误求助
解决Zillow API请求JSON解析失败的问题
核心问题分析
你遇到的JSONDecodeError: Expecting value: line 1 column 1,本质是请求返回的内容并非有效JSON——大概率是被Zillow的反爬机制拦截,返回了空内容、HTML验证码页面或错误提示,而非预期的接口数据。
具体解决方案
1. 补全浏览器级请求头
Zillow会校验请求的来源标识,缺失关键请求头会直接拦截爬虫请求。必须添加模拟真实浏览器的请求头:
import requests import json # 模拟Chrome浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Accept": "application/json, text/plain, */*", "Referer": "https://www.zillow.com/daytona-beach-fl-32119/" } # 替换为你捕获的API端点URL api_url = "你的Zillow API请求地址" response = requests.get(api_url, headers=headers) # 先打印返回内容,确认是否为有效JSON print(response.text) # 再尝试解析 try: property_data = json.loads(response.text) # 处理房产数据,比如提取列表 properties = property_data.get("cat1", {}).get("searchResults", {}).get("listResults", []) for prop in properties: print(f"地址: {prop.get('address')}, 价格: {prop.get('price')}") except json.JSONDecodeError as e: print(f"解析失败: {e}")
2. 验证返回内容类型
执行请求后先打印response.text:
- 如果返回HTML验证码页面:说明被反爬识别,需要更换
User-Agent、降低请求频率,或使用代理IP。 - 如果返回空内容:检查API URL是否正确,或尝试先访问Zillow主页面获取会话Cookie后再请求API。
3. 使用会话保持Cookie
Zillow可能需要会话Cookie验证请求合法性,先访问目标页面建立会话,再请求API:
session = requests.Session() # 先访问主页面获取Cookie session.get("https://www.zillow.com/daytona-beach-fl-32119/", headers=headers) # 复用会话请求API api_response = session.get(api_url, headers=headers) property_data = json.loads(api_response.text)
4. 确认API端点有效性
Zillow的API端点会动态变化,建议通过浏览器开发者工具的「Network」标签,重新捕获当前页面加载时的真实API请求URL和参数,确保请求地址正确。
内容的提问来源于stack exchange,提问作者Lalit Joshi
相关产品推荐
相关产品推荐

