用 Agent 帮我买房:小区数据采集、测评图文生成全流程
用 Agent 帮我买房小区数据采集、测评图文生成全流程我在苏州买房需要对比十几个小区的成交价、配套、物业费……手动查数据一天都搞不定一个小区。后来我让 Agent 帮我干这活爬数据、算评分、生成小红书图文一套流程走下来46 篇测评稿子全出来了。这篇文章完整记录这个实战过程——从踩坑到跑通让你看完觉得我也能这么用。一、背景一个人买房的信息地狱我在苏州买房目标区域锁定后候选小区有十几个。每个小区我需要知道挂牌价 成交价历史成交趋势、最近成交单价租金租售比物业费持有成本配套评分学校、医院、地铁、商业成交记录最近成交的楼层、面积、单价这些数据分散在房天下、贝壳、安居客等平台手动一个个查一个小区至少半小时。十几个小区就是一整天。而且数据格式不统一没法直接对比。更头疼的是我还运营小红书号做房产测评需要把数据整理成图文发布。一篇测评从查数据到出图文手动搞至少 2 小时。所以我的需求很明确让 Agent 帮我自动化数据采集和图文生成。二、整体架构Agent 做了什么┌─────────────────────────────────────────────────────────┐ │ 用户输入小区名 │ └────────────────────────┬────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ Agent 数据采集层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 挂牌价 │ │ 成交记录 │ │ 配套评分 │ │ │ │ 爬虫 │ │ 爬虫 │ │ 爬虫 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ 数据源房天下fang.com │ └────────────────────────┬────────────────────────────────┘ │ JSON 数据 ▼ ┌─────────────────────────────────────────────────────────┐ │ Agent 评分计算层 │ │ ┌──────────────────────────────────────────┐ │ │ │ 9 维评估体系 │ │ │ │ 价格 / 租售比 / 物业费 / 地段 / 教育 │ │ │ │ 医疗 / 交通 / 商业 / 成交价 │ │ │ └──────────────────────────────────────────┘ │ │ 输出评分 各维度雷达图数据 │ └────────────────────────┬────────────────────────────────┘ │ 评分结果 ▼ ┌─────────────────────────────────────────────────────────┐ │ Agent 内容生成层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 测评文案 │ │ 雷达图 │ │ 信息卡片 │ │ │ │ 生成 │ │ Canvas │ │ PNG │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ 输出小红书图文文案 图片 │ └─────────────────────────────────────────────────────────┘核心思路数据采集 → 评分计算 → 内容生成三步走全链路 Agent 驱动。三、第一步数据采集——踩坑比写代码难3.1 数据源选择我试过四个平台平台反爬难度数据质量可用性房天下低挂牌价、租金、物业费、成交记录、配套全有✅ 可用贝壳极高接口加密验证码数据最全❌ 放弃安居客高字体反爬接口签名挂牌价部分成交❌ 放弃好好选房高需登录风控成交数据不错❌ 放弃结论只有房天下能稳定爬取。虽然数据不是最全的但挂牌价、租金、物业费、成交记录、配套评分都有够用了。3.2 爬虫实现后端用 Node.js Express Cheerio核心逻辑很简单// 爬取小区详情页asyncfunctionfetchCommunityDetail(communityId){consturlhttps://m.fang.com/esf/suzhou/${communityId}.html;consthtmlawaitcachedFetch(url);const$cheerio.load(html);return{name:$(.community-name).text().trim(),avgPrice:parsePrice($(.avg-price).text()),rentPrice:parsePrice($(.rent-price).text()),propFee:parseFloat($(.prop-fee).text())||0,// ... 其他字段};}// 爬取成交记录asyncfunctionfetchDealRecords(communityId){consturlhttps://m.fang.com/esf/suzhou/${communityId}_deal.html;consthtmlawaitcachedFetch(url);const$cheerio.load(html);constrecords[];$(.deal-item).each((i,el){records.push({date:$(el).find(.deal-date).text(),price:parsePrice($(el).find(.deal-price).text()),area:$(el).find(.deal-area).text(),floor:$(el).find(.deal-floor).text(),});});returnrecords;}3.3 踩坑超时和缓存坑 1Node.js 的node-fetchv2 不支持timeout参数设置timeout: 15000会被静默忽略请求可能永远挂住。解法用AbortControllersetTimeout实现超时asyncfunctioncachedFetch(url,timeoutMs15000){constcontrollernewAbortController();consttimersetTimeout(()controller.abort(),timeoutMs);try{constresawaitfetch(url,{signal:controller.signal});clearTimeout(timer);returnawaitres.text();}finally{clearTimeout(timer);}}坑 2同一小区多次请求会触发风控。解法是加内存缓存采集一次后后续直接读缓存constcachenewMap();asyncfunctioncachedFetch(url){if(cache.has(url))returncache.get(url);constresultawaitfetchWithTimeout(url);cache.set(url,result);returnresult;}坑 3房天下移动端页面结构会变。解法CSS 选择器不要太严格用.contains()或模糊匹配兜底。四、第二步9 维评估体系——给房子打个分光有数据不够需要一个评分体系把数据变成可比较的结果。我设计了 9 个维度维度数据来源评分逻辑价格挂牌价与同区域均价对比越低越好租售比租金/挂牌价年租金/总价越高越好物业费物业费与区域均值对比地段配套评分综合打分教育附近学校数量 × 质量医疗附近医院数量 × 等级交通地铁/公交距离 × 线路数商业商场/超市数量 × 距离成交价最近成交记录与挂牌价偏差4.1 评分核心逻辑functionevaluate(data){constscores{};// 价格维度与区域均价对比constpriceRatiodata.avgPrice/data.areaAvgPrice;scores.pricepriceRatio0.9?9:priceRatio1.0?7:priceRatio1.1?5:3;// 租售比维度constrentalYield(data.rentPrice*12)/(data.avgPrice*data.avgArea);scores.rentalrentalYield0.03?9:rentalYield0.02?7:rentalYield0.01?5:3;// 成交价维度成交价 挂牌价越多说明议价空间大constdealDiscount(data.avgPrice-data.avgDealPrice)/data.avgPrice;scores.dealdealDiscount0.1?9:dealDiscount0.05?7:5;// ... 其他维度类似consttotalObject.values(scores).reduce((a,b)ab,0);constmaxTotal9*9;// 9个维度满分9分return{scores,totalScore:total,percentage:Math.round((total/maxTotal)*100),verdict:total60?值得买:total45?一般:不建议,};}4.2 踩坑除零防御坑有的小区没有成交记录avgDealPrice为 0做除法就 NaN 了。解法每个维度计算前都要做防御functionsafeDivide(a,b,fallback0){returnb0?fallback:a/b;}看起来很简单但这种边界条件在实际数据中到处都是。没有成交记录、物业费为空、租金查不到……每种情况都要处理。五、第三步图文生成——从数据到小红书5.1 文案生成Agent 根据评分结果生成真人语气的测评文案 XX雅园 测评 位置苏州·湖东板块 挂牌均价42,800 元/㎡ 综合评分7.2/980% ✅ 亮点 - 地段评分 8/9配套成熟 - 成交价低于挂牌价 8%议价空间大 - 物业费 3.8 元/㎡板块中档水平 ⚠️ 注意 - 租售比偏低1.8%投资回报一般 - 教育配套评分 5/9学区一般 结论自住可考虑投资需谨慎踩坑小红书文案必须用真人语气不能有任何 AI 痕迹。早期版本文案太工整读者一眼看出是机器生成的。后来调整为更口语化、带个人观点的风格效果好了很多。5.2 图片生成用微信小程序的 Canvas 画雷达图 信息卡片// 小程序端 Canvas 绘制雷达图functiondrawRadarChart(ctx,data){constdimensions[价格,租售比,物业费,地段,教育,医疗,交通,商业,成交价];constcx150,cy150,maxR100;// 画底图9边形网格dimensions.forEach((_,i){constangle(Math.PI*2*i)/dimensions.length-Math.PI/2;// 画从中心到顶点的线ctx.beginPath();ctx.moveTo(cx,cy);ctx.lineTo(cxmaxR*Math.cos(angle),cymaxR*Math.sin(angle));ctx.stroke();});// 画数据区域ctx.beginPath();dimensions.forEach((_,i){constangle(Math.PI*2*i)/dimensions.length-Math.PI/2;constr(data[i]/9)*maxR;constxcxr*Math.cos(angle);constycyr*Math.sin(angle);if(i0)ctx.moveTo(x,y);elsectx.lineTo(x,y);});ctx.closePath();ctx.fillStylergba(54, 162, 235, 0.3);ctx.fill();}5.3 分享功能测评结果支持分享给微信好友和朋友圈// result.js 分享逻辑onShareAppMessage(){return{title:${this.data.communityName}${this.data.verdict}${this.data.percentage}分,path:/pages/result/result?data${encodeURIComponent(JSON.stringify(this.data))},};},onShareTimeline(){return{title:${this.data.communityName}房价测评${this.data.verdict},};},六、性能优化让生成图片不再慢用户反馈图片生成有点慢。根因是点击开始测评时才去请求地段配套数据API 请求 3-5 秒用户在这期间干等。解法预取。在用户选择小区时就提前把地段配套数据拉到内存缓存// 选择小区时预取asyncfunctionprefetchLocationData(communityId){constcachedlocationCache.get(communityId);if(cached)returncached;constdataawaitfetchLocationData(communityId);locationCache.set(communityId,data);returndata;}// 开始测评时直接读缓存asyncfunctionevaluate(communityId){constlocationDatalocationCache.get(communityId)||awaitfetchLocationData(communityId);// ... 评分计算}效果选择小区时无感预取点测评按钮后 0 等待直接出图。七、从工具到内容46 篇测评的生产流水线有了数据采集 评分 图文生成的全链路生产测评内容就变成了流水线输入小区名 → 爬数据5s→ 算评分1s→ 生成图文3s→ 发布小红书手动单篇从 2 小时压缩到 10 秒不含手动发布。46 篇测评如果手动搞要 90 小时用 Agent 后实际生产时间不到 1 小时。效果对比指标纯手动Agent 辅助单篇耗时2 小时10 秒数据准确度依赖人工查抄爬虫自动采集数据源统一评分一致性主观判断波动大9 维体系客观可比46 篇总耗时~90 小时 1 小时错误率抄错/算错除零防御参数校验八、踩坑总结6 个实战经验1. 数据源选最稳的不是最全的贝壳数据最全但反爬最严花 3 天搞不定。房天下数据够用1 天就跑通了。先跑通再优化。2. 每个数值计算都做除零防御真实数据处处是坑没有成交记录的小区、物业费为空的小区、租金查不到的小区……每个a / b都要防b 0。3. 小红书文案要真人语气工整的报告没人看。口语化、带个人观点、有踩有赞的文案才有人互动。4. 图片不要标注数据来源早期图片上标注了数据来源好好选房被平台判定为广告引流。后来去掉所有来源标注只保留测评结论。5. 预取比懒加载好用户选择小区时预取数据比点击后才加载体验好 10 倍。预取是消灭等待感的关键。6. Agent 不替代决策只提供信息评分体系是客观工具但买房决策还要考虑个人偏好楼层、朝向、通勤距离等。Agent 的价值是让你在信息充分的情况下做决策而不是替你做决策。九、下一步把这个能力做成小程序这个数据采集 评分的流程我已经封装成微信小程序房价测来测去让任何人都能输入小区名、拿到 9 维评分。小程序技术栈后端Node.js Express Cheerio 爬虫前端微信小程序原生开发评分引擎纯 JS 实现9 维评估体系核心功能输入价格 → 判断值不值 → 输出评分 雷达图 测评结论。这就是 Agent 实战的价值从一个真实需求出发把重复劳动自动化再把能力产品化。十、总结回顾这个实战项目Agent 扮演了三个角色角色做了什么效果数据采集员爬取房天下数据单小区 5 秒替代手动 30 分钟分析师9 维评分计算客观可比替代主观判断内容生成器测评文案 雷达图10 秒出稿替代 2 小时手写关键体会Agent 的价值在于把人从重复劳动中解放出来而不是替代人的判断先跑通最小闭环再优化细节——从 1 个小区到 46 篇从脚本到小程序数据采集的坑最多——选数据源、防反爬、做缓存、处理空值每一步都是实战内容生成要符合平台调性——小红书要真人语气不要 AI 味下一篇我会分享用 Agent 做小程序的完整实战——从需求到代码Agent 如何帮我把房价测来测去从想法变成产品。