如何从RETS服务器获取房源信息变更历史?
获取RETS服务器房源变更历史的方案
标准RETS实现方式
RETS本身没有强制统一的历史数据获取规范,但绝大多数MLS(房地产多重上市服务)会通过以下两种常规方式提供房源变更记录:
1. 专用历史资源/类
很多RETS服务器会提供命名为PropertyHistory、ListingHistory这类专用的历史资源,对应的资源类(Class)通常包含变更时间、变更字段、旧值/新值、变更类型(价格调整、状态变更等)核心字段。
你可以先通过GetMetadata请求获取服务器元数据,确认是否存在这类资源:
GET /rets/Login?Transaction=GetMetadata&Type=Resource&ID=*&Format=COMPACT
解析返回结果,查找带「History」关键词的资源,再进一步获取该资源的类和字段详情。
2. 增量查询+版本字段
如果没有专用历史资源,可利用RETS的增量查询结合房源版本字段(比如ModificationTimestamp、ListingVersion)自行生成历史:
- 定期(按业务需求设置为每小时/每天)调用
Search接口,筛选指定时间范围内修改过的房源:POST /rets/Search Query=(ModificationTimestamp=2024-01-01T00:00:00+) SearchType=Property Class=ResidentialProperty Format=COMPACT - 请求时务必包含
ListingVersion(或类似版本标识字段),每次获取到新版本房源后,与本地存储的旧版本对比,提取变更字段及内容,自行生成历史记录。
权限与配置注意事项
- 部分RETS服务器的历史数据需要额外申请访问权限,若查询不到相关资源,直接联系MLS管理员确认权限是否开通。
- 部分服务器会限制历史数据的保留时长(比如仅保留90天),需提前确认数据覆盖范围。
代码示例(Python)
检查是否存在专用历史资源
import rets # 初始化RETS客户端 client = rets.RetsClient( login_url="https://your-rets-server.com/rets/login", username="your-username", password="your-password" ) client.login() # 获取所有资源元数据 resources = client.get_metadata(resource_type="resource") for resource in resources: if "History" in resource["ResourceName"]: print(f"找到历史资源: {resource['ResourceName']} ({resource['ResourceID']})") # 获取该资源的类信息 classes = client.get_metadata(resource_type="class", resource_id=resource["ResourceID"]) for cls in classes: print(f" 类: {cls['ClassName']} ({cls['ClassID']})") # 获取字段信息 fields = client.get_metadata(resource_type="table", resource_id=resource["ResourceID"], class_id=cls["ClassID"]) for field in fields: print(f" 字段: {field['SystemName']} - {field['LongName']}") client.logout()
增量查询生成变更历史
import rets from datetime import datetime, timedelta client = rets.RetsClient( login_url="https://your-rets-server.com/rets/login", username="your-username", password="your-password" ) client.login() # 筛选过去24小时修改的房源 yesterday = datetime.now() - timedelta(days=1) query = f"(ModificationTimestamp={yesterday.strftime('%Y-%m-%dT%H:%M:%S')}+)" # 搜索房源,包含版本字段 results = client.search( search_type="Property", class_="ResidentialProperty", query=query, select="ListingKey,ListingVersion,Price,Status,ModificationTimestamp" ) # 对比本地存储的旧数据,生成历史记录 for result in results: listing_key = result["ListingKey"] new_version = int(result["ListingVersion"]) # 假设local_db是你的本地数据库实例 old_data = local_db.get_listing(listing_key) if old_data and old_data["ListingVersion"] < new_version: # 找出变更字段 changes = [] for field in ["Price", "Status"]: if old_data[field] != result[field]: changes.append({ "field": field, "old_value": old_data[field], "new_value": result[field], "change_time": result["ModificationTimestamp"] }) # 保存变更历史到本地 local_db.save_history(listing_key, changes) client.logout()
替代方案
如果RETS服务器完全不提供历史数据,只能通过定期全量同步,每次同步后与本地数据对比生成变更记录,但这种方式效率极低,仅适合小体量房源数据场景。
内容的提问来源于stack exchange,提问作者Iman
相关产品推荐
相关产品推荐

