一、为什么要做这个系统?背景与痛点
1.1 行业背景:电影信息过载与管理低效
随着影视行业的发展,用户面对海量电影资源时常常 “无从下手”,而电影公司的运营也存在诸多痛点:
- 用户端:传统平台按 “上映时间” 或 “票房” 排序电影,缺乏个性化推荐,用户需手动筛选,耗时且体验差;
- 企业端:中小型电影公司依赖人工统计电影数据、推广影片,不仅浪费人力,还难以精准触达目标用户;
- 数据端:电影评分、用户评论、地区分布等数据分散,无法有效分析用户偏好,导致推广策略 “盲目”。
这套系统的核心目标,就是用技术解决这些问题,让电影推荐更智能、管理更高效。
1.2 系统价值:三方共赢的设计
- 对用户:基于浏览、评分、收藏等行为,推荐 “量身定制” 的电影,减少筛选时间;
- 对电影公司:自动爬取豆瓣等平台的电影数据,可视化分析电影热度、类型分布,辅助推广决策;
- 对开发:验证 Python + 协同过滤在推荐系统中的实用性,为类似项目提供可复用的技术方案。
二、系统用了哪些关键技术?技术栈解析
系统围绕 “稳定、高效、易扩展” 选型,覆盖数据采集、后端开发、算法推荐、前端展示全流程,具体如下:
| 技术模块 | 具体选择 | 作用说明 |
|---|---|---|
| 后端开发 | Python 3.x + Django 3.2 | Python 负责核心逻辑,Django 提供 ORM、Admin 后台、URL 路由,遵循 MTV 架构,降低开发难度 |
| 数据存储 | MySQL 5.7+ | 存储用户信息、电影数据、评分记录等,支持高效查询,保障数据稳定性 |
| 推荐算法 | 协同过滤(用户 / 物品基) | 核心推荐逻辑:通过用户行为计算相似度,推荐 “相似用户喜欢的电影” 或 “相似电影” |
| 数据采集 | BeautifulSoup + Requests | 爬取豆瓣电影数据(标题、评分、导演、主演、上映时间),补充系统数据源 |
| 前端展示 | Vue + HTML/CSS | 实现动态交互界面(如推荐页、评论区),适配电脑 / 手机等设备 |
| 可视化工具 | ECharts | 生成电影类型统计、地区分布、热度排行等图表,直观展示数据 |
| 开发工具 | PyCharm + Navicat | PyCharm 用于 Python 代码开发,Navicat 用于 MySQL 数据库管理,提升开发效率 |
核心技术拆解:协同过滤算法
推荐算法是系统的 “大脑”,我选择协同过滤算法,原因是它无需依赖电影内容特征,仅通过用户行为就能挖掘潜在兴趣,适合电影这类 “高频更新” 场景。具体实现逻辑如下:
-
行为量化:为用户操作赋予权重(如 “评分> 5 分” 记 50 分、“收藏电影” 记 40 分、“跳过电影” 记 - 20 分),量化用户喜好;
-
相似度计算:
- 基于用户:计算目标用户与其他用户的行为相似度,找到 “兴趣相似的用户群”;
- 基于物品:分析电影被共同喜欢的频率(如电影 A 和 B 都被 100 个用户收藏),判断电影相似度;
-
生成推荐:结合两种相似度结果,为用户推荐 “相似用户喜欢的电影” 或 “相似电影”,同时参考电影热度调整优先级。
三、系统能做什么?功能设计与架构
3.1 核心功能:分角色设计
系统分为管理员和普通用户两种角色,权限清晰、操作高效,覆盖从数据管理到用户体验的全场景:
(1)管理员功能:掌控系统全局
-
电影数据管理:
- 基础操作:新增 / 删除 / 修改电影信息(标题、类型、导演、主演、封面图、上映时间);
- 高级功能:通过爬虫自动爬取豆瓣电影数据,按 “类型”“地区” 筛选电影,批量导入 / 导出数据;
-
用户管理:查看注册用户列表、删除过期账号、重置用户密码,保障账号安全;
-
推荐管理:调整协同过滤算法参数(如相似度阈值),查看推荐效果(如用户点击率);
-
可视化大屏:通过图表展示核心数据(电影类型分布、地区上映数量、每日播放量、用户评分统计),辅助运营决策;
-
资讯管理:发布电影拍摄动态、宣传片信息、主演访谈,提升用户粘性。
(2)普通用户功能:个性化体验
-
账号体系:注册 / 登录账号,修改个人信息(姓名、年龄、手机号);
-
电影互动:
- 浏览电影:按 “类型”“评分” 筛选电影,查看详情(剧情介绍、演员列表、用户评论);
- 评分收藏:对电影打分、收藏心仪影片,评分会影响后续推荐结果;
- 评论交流:发表观影感受,查看其他用户评论,辅助决策;
-
个性化推荐:登录后首页显示 “为你推荐” 列表,基于历史行为推荐电影,减少筛选时间。
3.2 系统架构:B/S 分层设计
系统采用B/S(浏览器 / 服务器)架构,从下到上分为三层,确保代码模块化、易维护:
-
数据层:MySQL 存储所有业务数据(用户表、电影表、评分表等),爬虫获取的外部数据先清洗再入库;
-
业务逻辑层:Django 框架的核心,包含:
- 模型层(Model):定义数据结构(如 “电影类”“用户类”),ORM 自动映射到数据库;
- 视图层(View):处理请求(如 “推荐电影”“爬取数据”),调用算法和模型层;
- 路由层(URLConf):配置 URL,将请求分发到对应视图;
-
表现层:浏览器展示的前端页面,通过 Vue 实现动态交互,ECharts 实现数据可视化。
用户/管理员 → 浏览器(表现层) → Django业务逻辑层(路由+视图+模型) → MySQL/爬虫(数据层)
3.3 数据库设计:核心表结构
数据库是系统的 “数据仓库”,我设计了 9 张核心表,覆盖用户、电影、评分等核心场景,确保数据关联清晰:
| 表名 | 核心字段 | 作用说明 |
|---|---|---|
| 用户表(yonghu) | id(主键)、账号、密码、姓名、年龄 | 存储普通用户注册信息 |
| 管理员表(users) | id(主键)、用户名、密码、角色 | 存储管理员账号,区分权限 |
| 电影表(dianyingxinxi) | id(主键)、电影名称、类型、导演、主演、评分、封面图 | 存储电影核心信息 |
| 评分表(dianyingpingfen) | id(主键)、电影名称、评分、用户账号 | 记录用户对电影的评分,用于推荐算法 |
| 收藏表(storeup) | id(主键)、用户 id、电影 id、收藏时间 | 存储用户收藏的电影,分析用户兴趣 |
| 电影分类表(dianyingfenlei) | id(主键)、分类名称 | 管理电影类型(如 “喜剧”“科幻”) |
四、系统如何实现?关键模块与代码
4.1 核心模块实现:代码片段示例
(1)电影数据爬虫(爬取豆瓣电影)
通过 BeautifulSoup 解析 HTML,获取电影名称、评分、导演等信息,存入 MySQL:
import requests
from bs4 import BeautifulSoup
import pymysql
from datetime import datetime
# 目标URL(豆瓣电影Top250某一页)
url = "https://movie.douban.com/top250?start=0&filter="
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/118.0.0.0 Safari/537.36"
}
# 发送请求,解析页面
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
movie_list = soup.find_all("div", class_="item") # 电影列表容器
# 连接MySQL
db = pymysql.connect(
host="127.0.0.1",
user="root",
password="123456",
database="movie_recommend"
)
cursor = db.cursor()
for movie in movie_list:
# 提取电影信息
title = movie.find("span", class_="title").get_text() # 电影名称
score = movie.find("span", class_="rating_num").get_text() # 评分
director = movie.find("p", class_="").get_text().split("\n")[1].strip().split(":")[1] # 导演
release_time = movie.find("p", class_="").get_text().split("\n")[2].strip().split("/")[0] # 上映时间
# 插入数据库
sql = """
INSERT INTO dianyingxinxi (col_dianyingmingcheng, col_pingfen, col_zuoci, col_shangyingshijian, col_addtime)
VALUES (%s, %s, %s, %s, %s)
"""
try:
cursor.execute(sql, (title, score, director, release_time, datetime.now()))
db.commit()
print(f"成功爬取:{title}")
except Exception as e:
db.rollback()
print(f"爬取失败:{e}")
finally:
db.close()
(2)协同过滤推荐算法(核心逻辑)
基于用户评分计算相似度,生成推荐列表:
import pandas as pd
import numpy as np
# 1. 读取用户评分数据(user_id: 用户ID, movie_id: 电影ID, score: 评分)
score_data = pd.read_sql("SELECT user_id, movie_id, score FROM dianyingpingfen", db)
# 2. 构建用户-电影评分矩阵
user_movie_matrix = score_data.pivot_table(index="user_id", columns="movie_id", values="score", fill_value=0)
# 3. 计算用户相似度(余弦相似度)
def cosine_similarity(user1, user2):
# 取两个用户共同评分的电影
common_movies = user_movie_matrix.loc[user1] * user_movie_matrix.loc[user2] != 0
if common_movies.sum() == 0:
return 0 # 无共同电影,相似度为0
# 计算余弦相似度
user1_scores = user_movie_matrix.loc[user1][common_movies]
user2_scores = user_movie_matrix.loc[user2][common_movies]
return np.dot(user1_scores, user2_scores) / (np.linalg.norm(user1_scores) * np.linalg.norm(user2_scores))
# 4. 为目标用户推荐电影
def recommend_movies(target_user, top_n=5):
# 计算目标用户与其他用户的相似度
user_similarities = {user: cosine_similarity(target_user, user) for user in user_movie_matrix.index if user != target_user}
# 取相似度最高的3个用户
top_similar_users = sorted(user_similarities.items(), key=lambda x: x[1], reverse=True)[:3]
# 收集相似用户喜欢的电影(目标用户未评分的)
target_user_movies = user_movie_matrix.loc[target_user][user_movie_matrix.loc[target_user] > 0].index
recommend_movies = []
for user, _ in top_similar_users:
user_movies = user_movie_matrix.loc[user][user_movie_matrix.loc[user] > 3].index # 评分>3的电影
recommend_movies.extend([movie for movie in user_movies if movie not in target_user_movies])
# 去重,返回Top N电影
return list(set(recommend_movies))[:top_n]
4.2 系统运行截图
五、系统好用吗?测试与优化
为确保系统稳定可用,我采用黑盒测试(功能测试)对核心模块进行验证,重点检测流程通顺性与数据准确性:
5.1 关键测试用例
| 测试功能 | 测试步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 管理员登录 | 输入正确账号密码 → 点击登录 | 成功进入后台主界面,显示功能菜单 | 符合预期 |
| 电影爬虫功能 | 进入电影管理 → 点击 “爬取豆瓣数据” | 5 分钟内爬取 20 条电影数据,存入数据库 | 符合预期,仅 1 条因页面结构变化爬取失败,已修复 |
| 个性化推荐 | 用户评分 3 部 “科幻电影” → 查看推荐页 | 推荐页前 5 条为 “科幻类” 电影 | 符合预期,推荐准确率约 85% |
| 用户评论 | 登录 → 进入电影详情 → 发表评论 | 评论成功显示,同时更新电影 “评论数” | 符合预期 |
5.2 常见问题与解决
- 问题 1:爬虫被豆瓣反爬拦截解决:添加动态 User-Agent(模拟不同浏览器),设置爬取间隔(1 秒 / 次),避免 IP 被封禁;
- 问题 2:推荐算法准确率低解决:优化行为量化规则(如 “评论电影” 权重从 40 分提升到 60 分),增加 “用户停留时长” 维度,准确率从 70% 提升到 85%;
- 问题 3:页面加载慢解决:对电影列表进行分页(每页 10 条),优化数据库查询(添加索引),页面加载时间从 3 秒缩短至 1 秒。
六、总结与未来计划
6.1 项目成果
这套个性化电影推荐系统已实现核心目标:
- 自动化:爬虫每日定时爬取豆瓣电影数据,无需人工干预;
- 个性化:协同过滤算法精准推荐用户感兴趣的电影,用户点击推荐率达 40%;
- 易用性:管理员通过 Django Admin 快速管理数据,用户通过浏览器即可访问。
七、资料获取
论文全文档(含目录、参考文献、致谢,可直接用于毕设答辩);
核心源码(含爬虫、推荐算法、Django 前后端代码,注释清晰);
系统运行教程(环境搭建步骤:Python 安装、MySQL 配置、Django 部署)。
👉 获取方式:关注我的主页或私信博主,即可获取完整资料!
如果本文对你的毕设或开发有帮助,欢迎点赞 + 收藏 + 关注,后续会持续分享推荐系统开发技巧!