缘起
看房那阵子我存了十几个楼盘的链接。一房一价表是图片,去化数据要翻主管部门的公告,价格每个中介给我一份说法——想把一个盘的备案价、剩余套数、去化率凑齐,半个多小时就没了,周末跑三个盘回来,笔记还是对不上,因为没有一处能把它们放在一起看。
这个项目最早只是我自己的一张表:楼盘、备案价、剩余套数、更新日期。
背景
要把这张表做可靠,得解决几件事。数据来源分散且形态不一:公示平台是结构化表格,销售现场是图片,中介口径是文字,得分别采集再对齐到同一个楼盘上。指标口径也要统一——什么算批准套数、什么算已签约、去化率按房源还是按面积、价格取备案均价还是最近成交,不同来源给的不是同一个东西。有了口径才谈得上比较:库存变化、价格走向、片区热度,以及刚需真正关心的那一句「现在是不是贵了」。
方案
按「把数据拉回来 → 对齐口径 → 摊开来看 → 盯住变化」这条链路做的:
- 自动把公示数据收进来:定时从住建局公开的新房预售与二手房成交公示接口分区分页采集,慢速礼貌请求,不打扰对方服务器;同一批数据按区域按天去重,只留一份
- 先对齐口径再谈比较:一房一价、楼栋、户型、销售状态分别采下来后归到同一个楼盘上;同名多预售证自动合并。「什么算已售」「去化率按套还是按面积」「热盘和将罄的线划在哪」都定死一套算法,页面上每项指标旁边就写着它怎么算
- 一眼看清市场:各区在售 / 已售 / 去化率、楼盘去化排行(热盘与将罄自动标出)、近 7 天供应走势,附数据截止时间
- 看一个盘能看到底:单价的最低 / 中位 / 最高、标准差、四分位数、折扣率,面积段与得房率,低中高楼层分布与楼层热力图,销售状态占比
- 多个盘放一起比:最多 5 个楼盘并排比价格、比去化、比库存,雷达图、柱状图、数据表三种视图,每项指标的最优值自动高亮
- 二手房另有一套看法:价格区间与挂牌时长分布、中介分布、笋盘与高挂标记(低于或高于项目均价 5%)、按挂牌时长折算的合理估价、面积与总价散点、近 12 个月价格趋势、库存健康度
- 盯着的盘变了会告诉你:收藏楼盘后,价格或在售率有变动就推送到企业微信,不用天天自己回来刷
- 每次分析都留档:同一楼盘加楼栋加户型,下次打开能直接和上一次比,价格是涨是跌、在售率降到多少都有对照
- 导出:一键导出 CSV(UTF-8 BOM),Excel 打开不乱码,方便自己再做二次加工
技术架构
| 模块 | 技术选型 |
|---|---|
| 后端 | Go 1.25 + Gin + SQLite(WAL 模式,纯 Go 驱动,交叉编译不需要 CGO) |
| 前端 | Vue3 + TypeScript + Vite + Element Plus + ECharts + Axios,12 个组件 |
| 采集 | 7 个公开公示接口(新房 4 个 / 二手房 3 个),分区调度 + 会话轮换 + 随机延迟 |
| 统计 | 标准差、四分位数、折扣率、库存健康度在本机自算,不依赖外部计算服务 |
| 展示 | 单页多 Tab;768px 以下换成手机版布局与底部 Tab,与桌面端共用同一套接口 |
| 部署 | Docker / docker-compose;单进程同时托管前端静态产物与接口,对外只有一个端口 |
管道分四段:采集 → 口径对齐 → 落库 → 统计与呈现。采集侧按行政区逐页抓,同一区域采集完成后写入供应快照(同区同日去重);采集有独立的事件日志记录成功、跳过与失败条数,任务支持中途暂停与续爬,重启后不会从头再抓一遍。重复查询走缓存层,避免每次重新计算。
前端在 window.innerWidth <= 768 时切换成另一套手机版模板(房源明细与历史记录从表格换成卡片流,图表边距与坐标轴标签同步收窄),不是简单的响应式缩放。
成果
- 覆盖量:二手房源 106,174 套、新房在售 16,882 套、已售 54,563 套,覆盖深圳 12 个行政区(龙岗 27,175、宝安 18,897、南山 17,354、福田 14,858、罗湖 13,778 …)。数据是真实采集来的,后台持续在跑、不断更新
- 从半小时以上到几秒:核一个盘的备案价、剩余套数、去化率,以前要翻公告、对图片表、听中介说法,凑齐得半小时以上;现在搜索框敲个楼盘名,几秒出结果
- 看房那阵子是真的在用:拿它做信息收集和横向对比——哪个片区货多、哪个盘快卖完、同一个盘最近是涨还是跌,不再靠一方的说法
- 口径写在页面上:去化率的分子分母、热盘与将罄的判定线、笋盘和高挂的 5% 阈值、合理估价的挂牌时长折扣,每项指标下面都写着算法,看到的数字能追溯到怎么算出来的
- 一台机器就能跑:数据落在本地单文件数据库,不需要另装数据库服务;局域网内手机、平板打开同一个地址就能看
体验
线上演示在 https://sz.bennywen.xyz —— 里面是真实采集的数据,直接就能点。手机浏览器打开同一个网址会自动换成手机版布局。
本地跑起来也一样:服务启动后浏览器打开本机地址即可,局域网内其他设备用同一个地址也能访问;数据是一个随服务走的单文件,换台机器拷过去就接着用。
