1. 项目概述
这个基于Python的京东手机数据可视化分析与推荐系统,是我去年指导计算机专业学生完成的毕业设计项目。它完美融合了爬虫技术、数据分析和Web开发三大方向,特别适合想要展示综合能力的毕业生。系统通过requests爬取京东手机数据,使用pyecharts进行可视化展示,并基于Flask框架构建完整的Web应用,最终实现了一个具备商品推荐功能的电商数据分析平台。
对于计算机专业的学生而言,这个项目有几个突出优势:首先,它涵盖了从数据采集到应用展示的完整流程;其次,使用了当前企业级开发中最流行的技术栈;最后,数据分析与可视化部分能直观展现技术成果,特别适合毕业答辩演示。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 核心组件选型
选择Flask框架是经过深思熟虑的:相比Django,Flask更轻量灵活,适合中小型项目快速开发。我们使用的主要技术栈包括:
- 爬虫层:requests + BeautifulSoup
- 数据存储:SQLite(开发环境)/MySQL(生产环境)
- 可视化:pyecharts 4.0+
- Web框架:Flask 2.0+
- 前端:Bootstrap 5 + jQuery
提示:项目初期建议使用SQLite简化部署,答辩前可迁移到MySQL体现技术深度。
2.2 系统模块设计
系统采用典型的三层架构:
- 数据采集层:定时爬取京东手机数据
- 业务逻辑层:实现数据分析与推荐算法
- 展示层:通过Web界面展示可视化图表
这种分层设计使得各模块耦合度低,方便后期功能扩展。比如要新增数据源,只需修改采集层代码,其他部分几乎不用调整。
3. 核心实现细节
3.1 京东数据爬取实战
爬虫部分是项目的第一个技术难点。京东有严格的反爬机制,我们通过以下策略应对:
python复制def fetch_jd_product(keyword):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Referer': 'https://www.jd.com/'
}
params = {
'keyword': keyword,
'enc': 'utf-8',
'wq': keyword,
'page': 1
}
try:
response = requests.get(
'https://search.jd.com/Search',
params=params,
headers=headers,
timeout=10
)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
关键注意事项:
- 必须设置合理的User-Agent和Referer
- 添加随机延迟(1-3秒)避免触发反爬
- 使用IP代理池应对封禁(毕业设计可省略)
- 异常处理要完善,避免程序崩溃
3.2 数据清洗与存储
爬取的原始数据需要经过严格清洗:
- 价格处理:去除"¥"符号,转为float类型
- 评价数处理:将"2万+"转为20000
- 去重:基于商品ID去除重复项
- 缺失值处理:对部分手机参数进行插值
存储设计示例:
python复制CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_id TEXT UNIQUE,
title TEXT,
price REAL,
comments INTEGER,
shop TEXT,
brand TEXT,
model TEXT,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3.3 可视化实现技巧
使用pyecharts时,我们总结了几点实用经验:
- 主题配置:使用内置的"dark"主题更适合展示场景
- 异步加载:大数据量时采用异步渲染避免页面卡顿
- 响应式设计:通过监听窗口resize事件实现图表自适应
示例代码(价格分布直方图):
python复制from pyecharts.charts import Bar
from pyecharts import options as opts
def price_distribution(data):
prices = [item['price'] for item in data]
ranges = ['0-999', '1000-1999', '2000-2999', '3000+']
counts = [len([p for p in prices if 0 <= p < 1000]),
len([p for p in prices if 1000 <= p < 2000]),
len([p for p in prices if 2000 <= p < 3000]),
len([p for p in prices if p >= 3000])]
bar = (
Bar()
.add_xaxis(ranges)
.add_yaxis("商品数量", counts)
.set_global_opts(
title_opts=opts.TitleOpts(title="手机价格分布"),
toolbox_opts=opts.ToolboxOpts()
)
)
return bar
3.4 推荐算法实现
基于内容的推荐算法实现要点:
- 特征提取:品牌、价格区间、评论数等级
- 相似度计算:使用余弦相似度算法
- 结果过滤:排除已浏览过的商品
核心算法代码:
python复制from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
def content_based_recommend(target_item, items, top_n=5):
# 特征工程
features = []
for item in items:
features.append(f"{item['brand']} {item['price_level']} {item['comment_level']}")
# TF-IDF向量化
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(features)
# 计算相似度
target_index = next(i for i, item in enumerate(items)
if item['product_id'] == target_item['product_id'])
sim_scores = cosine_similarity(tfidf_matrix[target_index], tfidf_matrix)
# 获取推荐结果
sim_indices = np.argsort(sim_scores[0])[::-1][1:top_n+1]
return [items[i] for i in sim_indices]
4. Flask Web应用开发
4.1 路由设计规范
合理的路由设计使项目结构更清晰:
python复制@app.route('/')
def index():
return render_template('index.html')
@app.route('/analysis')
def analysis():
data = get_analysis_data()
return render_template('analysis.html', data=data)
@app.route('/recommend/<product_id>')
def recommend(product_id):
item = get_product_by_id(product_id)
rec_items = get_recommendations(item)
return render_template('recommend.html', item=item, rec_items=rec_items)
4.2 模板继承技巧
使用Jinja2模板继承减少重复代码:
html复制<!-- base.html -->
<html>
<head>
{% block head %}{% endblock %}
</head>
<body>
{% include 'navbar.html' %}
<div class="container">
{% block content %}{% endblock %}
</div>
{% include 'footer.html' %}
</body>
</html>
<!-- analysis.html -->
{% extends "base.html" %}
{% block head %}
<title>数据分析</title>
{% endblock %}
{% block content %}
<div id="chart" style="width:900px;height:500px;"></div>
{% endblock %}
4.3 前后端交互优化
Ajax异步加载提升用户体验:
javascript复制$(document).ready(function() {
$('#search-btn').click(function() {
$.ajax({
url: '/search',
data: {keyword: $('#search-input').val()},
success: function(data) {
renderProducts(data);
}
});
});
});
5. 部署与性能优化
5.1 生产环境部署
使用Gunicorn+Nginx部署方案:
bash复制# 安装Gunicorn
pip install gunicorn
# 启动应用
gunicorn -w 4 -b 127.0.0.1:8000 app:app
# Nginx配置示例
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
}
}
5.2 缓存策略实施
使用Flask-Caching提升性能:
python复制from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'SimpleCache'})
cache.init_app(app)
@app.route('/hot-products')
@cache.cached(timeout=3600)
def hot_products():
return get_hot_products()
6. 常见问题解决方案
6.1 爬虫被封禁处理
- 检查User-Agent是否有效
- 添加随机延迟:
time.sleep(random.uniform(1, 3)) - 使用代理IP(毕业设计可不实现)
- 模拟登录获取cookies(针对需要登录的页面)
6.2 图表渲染异常
- 检查数据格式是否符合pyecharts要求
- 确保前端引入了正确的echarts.js
- 大数据量时启用异步加载
- 使用try-catch捕获渲染错误
6.3 推荐效果不佳
- 增加特征维度(如加入商品分类信息)
- 调整相似度计算算法(改用欧氏距离)
- 引入用户历史行为数据
- 实现混合推荐(内容+协同过滤)
7. 项目扩展方向
为了让项目更具竞争力,可以考虑以下扩展:
- 用户系统:实现收藏、浏览历史功能
- 价格监控:定时爬取并提醒降价商品
- 竞品分析:同时爬取多个电商平台数据
- 移动端适配:开发响应式前端界面
- 情感分析:对商品评论进行情感倾向分析
这个项目最让我满意的是它的完整性和实用性。从技术层面看,它涵盖了现代Web开发的完整流程;从展示效果看,丰富的可视化图表能让答辩老师眼前一亮;从实用价值看,商品推荐功能确实能解决用户的真实需求。对于计算机专业的学生来说,掌握这样一个项目的开发过程,对就业面试会有很大帮助。
