推荐采用以下稳健方案:
import json
import requests
import re
import pandas as pd
url = 'https://www.corelogic.com.au/our-data/recent-sales?postcode=5600'
# 发起请求(注意:部分站点会校验 User-Agent,建议添加)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
response.raise_for_status() # 抛出网络错误
# 正则提取 postcodeData = {...}; 中的 JSON 字符串(非贪婪匹配至首个 };)
match = re.search(r'postcodeData\s*=\s*(\{[^}]*\});', response.text)
if not match:
raise ValueError("Failed to locate 'postcodeData' variable in script")
json_str = match.group(1)
data = json.loads(json_str)
# 解析为 DataFrame:data 是列表,通常含一个元素,其 properties 为实际记录数组
df = pd.DataFrame(data['data'][0]['properties'])
print(df.head())✅ 关键说明:
- 正则 r'postcodeData\s*=\s*(\{[^}]*\});' 专为该页面结构设计,可安全捕获单层花括号内的 JSON(因数据本身不含嵌套 {},无需复杂递归解析);
- 若未来页面升级为多层嵌套或变量名变更,建议改用 r'postcodeData\s*=\s*(\{.*?\});' 配合 re.DOTALL 标志,并增加 JSON 解析容错(如 json.loads(..., strict=False));
- requests.get() 默认不发送 User-Agent,易触发 403;务必添加合理请求头模拟浏览器行为;
- 数据字段(如 address, salePrice, soldDate)均位于 properties 列表中,可直接用于分析或导出:df.to_csv('sales_5600.csv', index=False)。
⚠️ 注意事项:
- 该方法依赖前端代码稳定性,若网站将 postcodeData 改为动态生成或加密变量名,需转向 Selenium 或 Playwright 渲染后提取;
- CoreLogic 明确标注数据“for demonstration only”,商用前请务必查阅其数据使用条款,避免合规风险;
- 单次请求仅返回 90 条随机记录,无分页参数暴露,不可批量获取全量数据。
掌握这种“JS 内联 JSON 提取”技巧,能高效应对大量 SPA(单页应用)类数据门户,是现代网页抓取工程师的必备能力之一。

















