1. 项目概述
这个基于Django+Vue的酒店大数据分析系统,是我去年指导计算机专业学生完成的毕业设计项目。它整合了Hadoop生态的大数据处理能力和协同过滤推荐算法,为酒店行业提供了一套完整的从数据采集到可视化展示的解决方案。系统最大的亮点在于将民宿客栈这类非标住宿业态也纳入了分析范围,这在同类系统中并不多见。
2. 技术架构解析
2.1 整体技术栈设计
系统采用前后端分离架构:
- 后端:Django + Django REST framework
- 前端:Vue.js + Element UI
- 大数据处理:Hadoop + Spark
- 数据库:MySQL + MongoDB
- 爬虫框架:Scrapy + Selenium
选择Django是因为其自带Admin后台,适合快速开发数据管理系统;Vue的响应式特性则完美适配数据可视化需求。这种组合在保证开发效率的同时,也满足了毕业设计对技术深度的要求。
2.2 关键技术实现
2.2.1 数据采集层
我们设计了多源数据采集方案:
# Scrapy爬虫示例 class HotelSpider(scrapy.Spider): name = 'jiujiang' custom_settings = { 'DOWNLOAD_DELAY': 2, 'CONCURRENT_REQUESTS_PER_DOMAIN': 1 } def parse(self, response): for hotel in response.css('.hotel-item'): yield { 'name': hotel.css('h3::text').get(), 'price': hotel.css('.price::text').get()[1:], 'location': hotel.xpath('.//span[@class="loc"]/text()').get() }对于反爬严格的平台,我们使用Selenium模拟人工操作,并设置了合理的请求间隔。采集的数据包括:
- 酒店基础信息(名称、位置、房型)
- 用户评论数据(文本+评分)
- 价格波动数据(按日期存储)
2.2.2 数据处理层
原始数据经过以下处理流程:
- 使用HDFS存储原始数据
- 通过Spark进行ETL处理
- 关键指标计算:
- 入住率趋势分析
- 价格敏感度模型
- 用户画像构建
# Spark提交命令示例 spark-submit \ --class com.jiujiang.analysis.PriceModel \ --master yarn \ --deploy-mode cluster \ --executor-memory 4G \ price_model.jar input/hotel_data output/price_model3. 核心算法实现
3.1 协同过滤推荐算法
系统采用混合推荐策略:
- 基于用户的协同过滤(UserCF)
- 基于物品的协同过滤(ItemCF)
- 基于内容的推荐(CB)
算法实现关键点:
# 相似度计算示例 def cosine_sim(vec1, vec2): dot_product = np.dot(vec1, vec2) norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) return dot_product / (norm1 * norm2) # 评分预测 def predict_rating(user_id, item_id, sim_matrix): user_ratings = rating_matrix[user_id] weighted_sum = 0 sim_sum = 0 for other_item, rating in user_ratings.items(): if other_item != item_id: sim = sim_matrix[item_id][other_item] weighted_sum += sim * rating sim_sum += abs(sim) return weighted_sum / sim_sum if sim_sum != 0 else 03.2 算法优化技巧
数据稀疏性问题处理:
- 采用SVD矩阵分解降维
- 引入时间衰减因子(最近行为权重更高)
冷启动解决方案:
- 新用户:采用热门推荐+注册信息筛选
- 新酒店:基于内容相似度推荐
实时性保障:
- 离线计算用户相似度矩阵(每日更新)
- 在线部分只做轻量级计算
4. 可视化系统实现
4.1 前端架构设计
采用Vue CLI搭建项目骨架:
src/ ├── components/ │ ├── HotelMap.vue # 酒店地理分布 │ ├── TrendChart.vue # 价格趋势图 │ └── Recommend.vue # 推荐结果展示 ├── store/ # Vuex状态管理 └── views/ ├── Analysis.vue # 数据分析页 └── Dashboard.vue # 数据总览4.2 典型可视化案例
4.2.1 价格热力图
使用ECharts实现日历热力图,展示全年价格波动:
// Vue组件中的ECharts配置 option = { tooltip: {}, visualMap: { min: 0, max: 1000, calculable: true, orient: 'horizontal' }, calendar: { range: ['2023-01', '2023-12'] }, series: { type: 'heatmap', coordinateSystem: 'calendar', data: heatData } }4.2.2 用户画像雷达图
展示不同用户群体的特征分布:
radarOption = { radar: { indicator: [ { name: '价格敏感度', max: 100 }, { name: '服务要求', max: 100 }, { name: '位置偏好', max: 100 }, { name: '设施需求', max: 100 } ] }, series: [{ type: 'radar', data: [ { value: [85, 62, 78, 55], name: '商务旅客' }, { value: [45, 78, 60, 82], name: '家庭出游' } ] }] }5. 部署与优化实践
5.1 系统部署方案
我们采用Docker-compose编排服务:
version: '3' services: web: build: ./web ports: - "8000:8000" depends_on: - redis - mysql hadoop: image: sequenceiq/hadoop-docker ports: - "50070:50070" - "8088:8088" spark: image: bitnami/spark environment: - SPARK_MODE=master ports: - "8080:8080"5.2 性能优化经验
数据库优化:
- MySQL添加复合索引(酒店ID+日期)
- MongoDB使用分片集群存储评论数据
缓存策略:
- 使用Redis缓存热门推荐结果
- 设置合理的TTL(通常2小时)
前端优化:
- 组件懒加载
- ECharts数据分片加载
6. 项目扩展方向
在实际开发中我们还探索了以下扩展可能:
情感分析增强:
- 使用BERT模型分析用户评论情感
- 将情感分数作为推荐权重因子
动态定价模型:
- 结合供需关系预测
- 考虑特殊事件(节假日、展会等)
微信小程序端:
- 基于uni-app开发跨平台应用
- 对接微信原生地图功能
这个项目完整实现了从数据采集到智能推荐的闭环,特别适合作为计算机专业综合实践案例。所有源码都经过完整测试,可以直接作为毕业设计基础框架使用