基于Python的个性化电影推荐系统的设计与实现

94 阅读10分钟

一、为什么要做这个系统?背景与痛点

1.1 行业背景:电影信息过载与管理低效

随着影视行业的发展,用户面对海量电影资源时常常 “无从下手”,而电影公司的运营也存在诸多痛点:

  • 用户端:传统平台按 “上映时间” 或 “票房” 排序电影,缺乏个性化推荐,用户需手动筛选,耗时且体验差;
  • 企业端:中小型电影公司依赖人工统计电影数据、推广影片,不仅浪费人力,还难以精准触达目标用户;
  • 数据端:电影评分、用户评论、地区分布等数据分散,无法有效分析用户偏好,导致推广策略 “盲目”。

这套系统的核心目标,就是用技术解决这些问题,让电影推荐更智能、管理更高效。

1.2 系统价值:三方共赢的设计

  • 对用户:基于浏览、评分、收藏等行为,推荐 “量身定制” 的电影,减少筛选时间;
  • 对电影公司:自动爬取豆瓣等平台的电影数据,可视化分析电影热度、类型分布,辅助推广决策;
  • 对开发:验证 Python + 协同过滤在推荐系统中的实用性,为类似项目提供可复用的技术方案。

二、系统用了哪些关键技术?技术栈解析

系统围绕 “稳定、高效、易扩展” 选型,覆盖数据采集、后端开发、算法推荐、前端展示全流程,具体如下:

技术模块具体选择作用说明
后端开发Python 3.x + Django 3.2Python 负责核心逻辑,Django 提供 ORM、Admin 后台、URL 路由,遵循 MTV 架构,降低开发难度
数据存储MySQL 5.7+存储用户信息、电影数据、评分记录等,支持高效查询,保障数据稳定性
推荐算法协同过滤(用户 / 物品基)核心推荐逻辑:通过用户行为计算相似度,推荐 “相似用户喜欢的电影” 或 “相似电影”
数据采集BeautifulSoup + Requests爬取豆瓣电影数据(标题、评分、导演、主演、上映时间),补充系统数据源
前端展示Vue + HTML/CSS实现动态交互界面(如推荐页、评论区),适配电脑 / 手机等设备
可视化工具ECharts生成电影类型统计、地区分布、热度排行等图表,直观展示数据
开发工具PyCharm + NavicatPyCharm 用于 Python 代码开发,Navicat 用于 MySQL 数据库管理,提升开发效率

核心技术拆解:协同过滤算法

推荐算法是系统的 “大脑”,我选择协同过滤算法,原因是它无需依赖电影内容特征,仅通过用户行为就能挖掘潜在兴趣,适合电影这类 “高频更新” 场景。具体实现逻辑如下:

  1. 行为量化:为用户操作赋予权重(如 “评分> 5 分” 记 50 分、“收藏电影” 记 40 分、“跳过电影” 记 - 20 分),量化用户喜好;

  2. 相似度计算

    • 基于用户:计算目标用户与其他用户的行为相似度,找到 “兴趣相似的用户群”;
    • 基于物品:分析电影被共同喜欢的频率(如电影 A 和 B 都被 100 个用户收藏),判断电影相似度;
  3. 生成推荐:结合两种相似度结果,为用户推荐 “相似用户喜欢的电影” 或 “相似电影”,同时参考电影热度调整优先级。

三、系统能做什么?功能设计与架构

3.1 核心功能:分角色设计

系统分为管理员普通用户两种角色,权限清晰、操作高效,覆盖从数据管理到用户体验的全场景:

(1)管理员功能:掌控系统全局

  • 电影数据管理

    • 基础操作:新增 / 删除 / 修改电影信息(标题、类型、导演、主演、封面图、上映时间);
    • 高级功能:通过爬虫自动爬取豆瓣电影数据,按 “类型”“地区” 筛选电影,批量导入 / 导出数据;
  • 用户管理:查看注册用户列表、删除过期账号、重置用户密码,保障账号安全;

  • 推荐管理:调整协同过滤算法参数(如相似度阈值),查看推荐效果(如用户点击率);

  • 可视化大屏:通过图表展示核心数据(电影类型分布、地区上映数量、每日播放量、用户评分统计),辅助运营决策;

  • 资讯管理:发布电影拍摄动态、宣传片信息、主演访谈,提升用户粘性。

(2)普通用户功能:个性化体验

  • 账号体系:注册 / 登录账号,修改个人信息(姓名、年龄、手机号);

  • 电影互动

    • 浏览电影:按 “类型”“评分” 筛选电影,查看详情(剧情介绍、演员列表、用户评论);
    • 评分收藏:对电影打分、收藏心仪影片,评分会影响后续推荐结果;
    • 评论交流:发表观影感受,查看其他用户评论,辅助决策;
  • 个性化推荐:登录后首页显示 “为你推荐” 列表,基于历史行为推荐电影,减少筛选时间。

3.2 系统架构:B/S 分层设计

系统采用B/S(浏览器 / 服务器)架构,从下到上分为三层,确保代码模块化、易维护:

  1. 数据层:MySQL 存储所有业务数据(用户表、电影表、评分表等),爬虫获取的外部数据先清洗再入库;

  2. 业务逻辑层:Django 框架的核心,包含:

    • 模型层(Model):定义数据结构(如 “电影类”“用户类”),ORM 自动映射到数据库;
    • 视图层(View):处理请求(如 “推荐电影”“爬取数据”),调用算法和模型层;
    • 路由层(URLConf):配置 URL,将请求分发到对应视图;
  3. 表现层:浏览器展示的前端页面,通过 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. 问题 1:爬虫被豆瓣反爬拦截解决:添加动态 User-Agent(模拟不同浏览器),设置爬取间隔(1 秒 / 次),避免 IP 被封禁;
  2. 问题 2:推荐算法准确率低解决:优化行为量化规则(如 “评论电影” 权重从 40 分提升到 60 分),增加 “用户停留时长” 维度,准确率从 70% 提升到 85%;
  3. 问题 3:页面加载慢解决:对电影列表进行分页(每页 10 条),优化数据库查询(添加索引),页面加载时间从 3 秒缩短至 1 秒。

六、总结与未来计划

6.1 项目成果

这套个性化电影推荐系统已实现核心目标:

  • 自动化:爬虫每日定时爬取豆瓣电影数据,无需人工干预;
  • 个性化:协同过滤算法精准推荐用户感兴趣的电影,用户点击推荐率达 40%;
  • 易用性:管理员通过 Django Admin 快速管理数据,用户通过浏览器即可访问。

七、资料获取

论文全文档(含目录、参考文献、致谢,可直接用于毕设答辩);

核心源码(含爬虫、推荐算法、Django 前后端代码,注释清晰);

系统运行教程(环境搭建步骤:Python 安装、MySQL 配置、Django 部署)。

👉 获取方式:关注我的主页或私信博主,即可获取完整资料!

如果本文对你的毕设或开发有帮助,欢迎点赞 + 收藏 + 关注,后续会持续分享推荐系统开发技巧!