做了一个「房产数据采集 + AI 房价预测」全栈项目,从爬虫到 LangGraph Agent 一条龙

毕设 / 简历项目收割机来了:FastAPI + LangChain + LangGraph + Agent + Vue3 + MySQL, 数据采集、后台管理、数据分析、机器学习预测、AI 智能问答,一个项目全部覆盖。 这篇带你过一遍它的技术栈、功能,以及——最重要的是——你能从它身上学到什么、该刷哪些面试题。

很多同学找项目有个痛点:要么是纯 CRUD 管理系统,写进简历撑不起亮点;要么是纯算法项目,部署不了、演示不了。

这个「房产数据采集与房价预测分析平台」就是为了解决这个痛点而生——它是一条完整的业务闭环:

数据采集 → 数据管理 → 数据分析 → 房价预测 → AI 智能问答

以长沙六大片区(岳麓、雨花、天心、芙蓉、开福、望城)的真实房源结构为样本, 前台是仿安居客/贝壳的用户门户,后台是 17 个模块的管理系统, 中间还嵌了一个基于 LangGraph 的房产智能体「房小智」。

下面分四部分讲清楚。


一、项目技术栈

后端(全异步)

  • FastAPI + Uvicorn:异步 Web 框架,自动生成 Swagger 文档

  • Tortoise ORM + aiomysql:异步 MySQL ORM,连接池

  • PyJWT:登录态签发与角色鉴权(管理员 / 普通用户双端隔离)

爬虫

  • Aiohttp + BeautifulSoup4:异步采集引擎,支持限流、重试、代理,目标站不可用时自动降级为「模拟采集」,保证全流程任何环境都能演示

机器学习

  • scikit-learn + pandas / numpy + joblib:线性回归 vs 随机森林双模型对比训练,RMSE / MAE / R² 指标入库,模型持久化

AI 编排(项目最大的差异化亮点)

  • LangChain 1.x + LangGraph 1.x + langchain-openai:三节点状态机 Agent(意图分析 → 工具执行 → 回答生成),SSE 流式输出,未配置 API Key 时自动降级为规则引擎

前端

  • Vue 3 组合式 API + Vite:前台门户 + 后台管理双端单页应用

  • Element Plus:17 个管理模块的组件体系

  • ECharts 5:片区均价柱状图、分类饼图、模型指标趋势线

  • markdown-it + highlight.js:AI 回答的 Markdown 渲染与代码高亮

数据库

  • MySQL 8(utf8mb4):16 张业务表,从房源主表到大模型配置表


二、项目功能描述

前台门户(普通用户)

  • 首页:轮播图 + 图内悬浮搜索条 + 热门词一键搜索 + 房源分类宫格 + 片区房价参考卡(点卡片直达筛选后的列表页)

  • 房源列表:分类 Tab 切换(二手房/新房/租房/商铺),片区、价格区间、面积、户型、装修、朝向、近地铁、学区多维筛选,五种排序,筛选状态与 URL 同步,一键重置

  • 房源详情:图片画廊(左右切换 + 计数徽章)、核心卖点宫格、首付与月供参考(等额本息估算)、一键收藏、同片区相似房源推荐

  • AI 智能助手「房小智」:自然语言找房("雨花区 100 万以内的近地铁二手房")、房价预估、片区走势查询、购房政策问答;回答流式输出,推荐房源渲染成可点击卡片直达详情页;支持多会话管理,历史会话的房源卡片可完整还原

  • 个人中心:头像上传即时生效、资料修改、修改密码、我的收藏

后台管理(管理员)

  • 数据管理:房源 / 片区 / 分类(带图标选择器)/ 轮播图

  • 采集管理:采集任务(目标站、页数、限流、代理)+ 采集日志实时查看

  • 模型管理:一键触发双模型对比训练,指标趋势曲线可视化,在线输入房源参数即可估价

  • AI 智能体配置:多厂商大模型配置热切换(DeepSeek / 通义 / Kimi 等 OpenAI 兼容接口)、系统 Prompt 在线调整、购房知识库管理、用户对话记录审计

  • 用户管理:管理员信息、普通用户


三、拿到这个项目能学到什么

1. 后端工程化(不只是会写接口)

  • 全异步技术栈怎么组织:async 接口、异步 ORM、连接池、SSE 流式响应

  • 统一返回体 + 全局异常处理怎么设计,让前后端联调不扯皮

  • JWT 鉴权与路由守卫的双重角色校验怎么落地

  • 一个出口治理一类问题:比如在统一返回体里递归把 ISO 时间规范化,全站时间格式一处修好

2. LangGraph Agent 的正确打开方式

  • 不做"套壳聊天"——而是意图识别 → 工具调用 → 上下文生成的状态机编排

  • 降级思维:没配 Key 用规则引擎兜底,LLM 挂了不白屏——生产环境最看重的容错设计

  • 工具函数怎么把自然语言解析成查询条件("雨花区" → districtId,"100 万以内" → maxPrice)

  • 结构化结果怎么和流式文本一起走 SSE 推给前端

3. 机器学习从训练到上线

  • 特征工程:片区、户型、朝向这些类别特征怎么编码进模型

  • 双模型对比实验、评估指标(RMSE/MAE/R²)入库与可视化

  • joblib 模型持久化 + FastAPI 在线推理服务,输出点估计和置信区间

4. 爬虫工程实践

  • 异步并发、请求限流、失败重试、代理配置

  • 通用选择器解析 + 数据清洗入库

  • "降级采样"思路:真实站点不可用时如何生成接近真实分布的数据保住全流程

5. 前端体验细节(演示最加分的部分)

  • 流式聊天页的粘底跟随 + 防抖:用户上翻历史不被自动滚动拽回去

  • 多维筛选状态与 URL 双向同步,刷新、分享链接都不丢状态

  • 仿安居客的画廊、排序条、面包屑、图标选择器等组件化封装

  • ECharts 在 Vue3 里的初始化时机、响应式与销毁

6. 数据库设计

  • 16 张表怎么支撑双端业务:房源主表、会话表、采集任务/日志、模型指标、大模型配置

  • 一对多、多对多关系与冗余字段的取舍


四、可以去刷什么对应的面试题

FastAPI / Python 异步

  1. async/await 的原理?事件循环是什么?

  2. FastAPI 为什么快?和 Flask / Django 的本质区别?

  3. 什么是 SSE?和 WebSocket 的区别,各自适用什么场景?

  4. uvicorn 和 gunicorn 是什么关系?多 worker 部署要注意什么?

  5. Pydantic 的作用?接口校验失败怎么统一处理?

  6. FastAPI 的依赖注入(Depends)用过吗?鉴权怎么基于它实现?

MySQL / ORM

  1. 索引的底层数据结构?为什么用 B+ 树而不是 B 树 / 哈希表?

  2. 联合索引的最左前缀原则?范围查询为什么会让后面的索引失效?

  3. 结合项目:房源表的 districtId / categoryId / status 该怎么建组合索引?

  4. 慢查询怎么排查?EXPLAIN 的关键字段有哪些?

  5. 事务的隔离级别?默认级别下会出现什么问题?

  6. 为什么选异步 ORM?Tortoise ORM 和 SQLAlchemy 的区别?

  7. 数据库连接池的作用?连接数怎么评估?

爬虫

  1. 异步爬虫比同步快在哪?aiohttp 和 requests 的本质区别?

  2. 怎么控制爬取频率不被封?说一个限流算法(令牌桶 / 漏桶)?

  3. 失败重试策略怎么设计?怎么保证重试的幂等?

  4. 常见反爬手段有哪些?分别怎么应对?

  5. 动态渲染页面(JS 加载)怎么爬?Selenium / Playwright 什么时候用?

  6. 数据清洗一般做哪些事?缺失值和异常值怎么处理?

  7. robots 协议是什么?爬虫的法律边界在哪?

机器学习

  1. 线性回归的基本假设有哪些?怎么判断拟合好坏?

  2. 随机森林为什么比单棵决策树稳?Bagging 的原理?

  3. RMSE 和 MAE 的区别?R² 是什么含义?

  4. 过拟合怎么发现、怎么解决?(结合项目答:限制 max_depth、控制 n_estimators)

  5. 训练集 / 测试集怎么切?为什么要固定 random_state?

  6. 类别特征编码方式有哪些?One-Hot 和 Label Encoding 怎么选?

  7. 特征重要性怎么看?随机森林能输出吗?

  8. 模型怎么上线部署?(结合项目:joblib 持久化 + FastAPI 推理接口 + 置信区间输出)

LangChain / LangGraph / Agent(AI 方向高频区)

  1. 什么是 Agent?ReAct 模式(思考-行动-观察)的循环是怎样的?

  2. LangGraph 的状态机和 LangChain 的 Chain 有什么区别?什么场景必须用图编排?

  3. 意图识别有哪些实现方案?大模型分类和规则引擎各有什么优劣?怎么结合?

  4. Function Calling / Tool Use 的原理?工具的 docstring 和参数描述为什么要写清楚?

  5. 大模型输出不稳定,工程上怎么兜底?(结合项目:规则引擎降级 + 模板回答 + 异常捕获)

  6. 多厂商模型怎么统一接入?(OpenAI 兼容协议、base_url 热切换)

  7. RAG 的原理?向量检索和关键词检索各有什么优劣?知识库问答怎么做?

  8. 什么是流式输出?Token 流怎么一步步推给前端?

  9. 大模型的 Temperature 参数是什么?什么场景调高、什么场景调低?

  10. 怎么评估一个 AI 对话系统的回答质量?

Vue 3 前端

  1. 组合式 API 相比选项式 API解决了什么问题?setup 语法糖的本质?

  2. ref 和 reactive 的区别?为什么解构 reactive 会失去响应式?

  3. computed 和 watch 的区别与使用场景?

  4. Vue3 的响应式为什么从 Object.defineProperty 换成 Proxy?

  5. v-if 和 v-show 的区别?key 的作用?

  6. 组件间通信有哪些方式?provide/inject 什么场景用?

  7. 路由守卫怎么实现登录拦截和角色隔离?

  8. 长列表性能优化有哪些手段?虚拟滚动原理?

  9. 首屏加载慢怎么优化?(路由懒加载、分包、图片懒加载)

  10. ECharts 在 SPA 里怎么正确初始化和销毁?resize 怎么监听?

项目场景题(用这个项目直接回答)

  1. "讲一下你这个项目最难的地方?"——LangGraph Agent 的意图识别 + 工具调用 + SSE 流式输出整条链路

  2. "如果 QPS 涨 100 倍你的系统会先在哪里挂?"——MySQL 连接池 / 同步的模型推理,引出缓存与异步任务队列

  3. "爬虫数据不准确怎么办?"——结合项目答:通用选择器 + 模拟采集降级 + 后台人工修正

  4. "AI 回答不可控怎么办?"——降级模板、知识库约束、意图白名单、对话记录审计

  5. "为什么用两套前端?"——角色隔离、安全边界与交互形态差异


五、可以去刷什么对应的面试题

登录

后台首页

房源管理

分类信息

Prompt 配置

采集任务

采集日志

前台首页

房源列表

地图找房

ai智能回答

我的收藏

写在最后

这个项目的价值不在于"房产"这个业务本身,而在于它把爬虫、后端、数据库、机器学习、AI Agent、前端工程串成了一条真实的流水线——

面试官问任何一个环节,你都有东西可讲;答辩演示时,从采集到 AI 找房全程不冷场。

项目里所有的降级设计(无 Key 也能聊、目标站挂了也能采)保证了它在任何机器上都能跑起来,这也是它和网上大多数"跑不起来"的项目最大的区别。

项目地址:桔桔波编程学习网 - 优质编程学习资源平台

觉得有用的话,点赞、在看、转发三连,下期见。

Logo

更多推荐