如何爬取CoreLogic网站中脚本加载的90条公开销售数据?
解决CoreLogic近期销售数据爬取问题
问题分析
- 403错误原因:你的请求未携带合法浏览器请求头,网站反爬机制拦截了默认
urllib请求。 - 数据定位错误:你指定的
script标签类型不正确,目标加密数据通常存储在包含全局初始化状态的脚本块中(比如window.__INITIAL_STATE__变量)。
解决方案步骤
1. 携带请求头绕过403拦截
使用requests库(比urllib更易用),添加模拟浏览器的请求头,避免被反爬识别。
2. 定位正确的脚本数据块
页面加载时,目标销售数据会以加密形式嵌入在包含全局初始化状态的script标签内,需通过正则匹配定位。
3. 解密数据
网站的decodeEntities函数本质是处理HTML实体编码,直接用Python内置的html.unescape即可模拟解密逻辑。
完整代码示例
import requests from bs4 import BeautifulSoup import json import re from html import unescape # 目标URL url = "https://www.corelogic.com.au/our-data/recent-sales?postcode=5600" # 模拟浏览器请求头 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-Language": "en-US,en;q=0.9", "Referer": "https://www.corelogic.com.au/" } # 发送请求获取页面 response = requests.get(url, headers=headers) response.raise_for_status() # 确保请求成功 # 解析页面 soup = BeautifulSoup(response.text, "html.parser") # 查找包含初始化状态的脚本 script_tag = soup.find("script", string=re.compile(r"window\.__INITIAL_STATE__")) if not script_tag: raise ValueError("未找到包含初始化数据的脚本块") # 提取JSON数据 script_content = script_tag.string match = re.search(r"window\.__INITIAL_STATE__ = (.*?);", script_content, re.DOTALL) if not match: raise ValueError("无法提取初始化数据") initial_state = json.loads(match.group(1)) # 定位加密的销售数据(路径需根据网站实际结构调整) encrypted_sales_data = initial_state["recentSales"]["data"] # 解密数据 decrypted_data = [unescape(item) for item in encrypted_sales_data] # 提取90条记录 sales_records = decrypted_data[:90] # 输出示例 for idx, record in enumerate(sales_records, 1): print(f"记录 {idx}: {record}")
注意事项
- 请求头更新:若再次出现403,需将
User-Agent更新为当前主流浏览器的标识。 - 数据结构适配:网站可能调整
__INITIAL_STATE__内的数据路径,需通过浏览器开发者工具(F12)查看最新结构。 - 合规性:确保爬取行为符合网站
robots.txt及使用条款,避免法律风险。
内容的提问来源于stack exchange,提问作者AusTrain
相关产品推荐
相关产品推荐

