博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

1、项目介绍

技术栈:Python 语言、Vue 前端框架、Flask 后端框架、深度学习 LSTM 算法、豆瓣电影数据、Echarts 可视化分析、Scrapy 爬虫、影评情感分析、MySQL 数据库、双协同过滤推荐算法(基于用户 + 基于物品)
这个项目的研究背景:当前电影市场数据爆炸式增长,豆瓣等平台聚集海量电影信息与影评,但用户面临 “信息过载” 与 “推荐不精准” 的双重痛点 —— 传统推荐多依赖热门榜单,未结合用户情感偏好;同时,影评中蕴含的用户态度(正面 / 负面)未被有效挖掘,导致推荐无法匹配用户真实喜好,且人工采集电影数据效率低,数据展示缺乏直观性,制约用户观影决策效率。
这个项目的研究意义:技术层面,整合 Scrapy 爬虫、LSTM 情感分析、双协同过滤与 Echarts 可视化,实现 “数据采集 - 情感挖掘 - 推荐 - 展示” 全流程技术闭环;用户层面,通过影评情感分析与个性化推荐,帮助用户快速找到契合偏好的电影,直观把握电影数据趋势;行业层面,为电影推荐领域提供 “情感分析 + 多算法融合” 的解决方案,推动从 “泛化推荐” 向 “情感驱动型精准推荐” 转型,具备实际应用价值。

2、项目界面

(1)电影数据可视化分析—柱状图、南丁格尔玫瑰图
在这里插入图片描述

(2)电影数据可视化分析—面积图、曲线图
在这里插入图片描述

(3)电影数据展示

在这里插入图片描述

(4)电影年份类型评分分析(散点图)

在这里插入图片描述

(5)深度学习LSTM算法情感分析

在这里插入图片描述

(6)影评情感分析

在这里插入图片描述

(7)注册登录界面

在这里插入图片描述

(8)数据采集页面

在这里插入图片描述

3、项目说明

本项目是基于 Python 生态开发的豆瓣电影数据采集分析推荐系统,以 Vue 为前端框架、Flask 为后端框架,整合 Scrapy 爬虫、LSTM 情感分析、双协同过滤推荐与 Echarts 可视化技术,构建 “数据采集 - 情感挖掘 - 精准推荐 - 直观展示” 的完整体系,旨在解决电影信息杂乱、推荐不精准、影评价值未利用的问题。
(1)数据采集与存储
系统通过Scrapy 爬虫定向抓取豆瓣电影平台数据,涵盖电影基础信息(名称、年份、类型、评分)、用户影评(文本内容、评分)等,经数据清洗(过滤无效影评、补全缺失字段)后,结构化存储至MySQL 数据库,同时提供 “数据采集页面” 支持手动触发爬虫任务,确保数据实时更新,为后续分析与推荐提供可靠数据基础。
(2)影评情感分析(LSTM 算法)
核心采用深度学习 LSTM 算法挖掘影评情感价值:将爬取的影评文本进行预处理(分词、去停用词、词向量转换),输入 LSTM 模型进行训练,通过模型学习文本中的情感特征,实现对影评 “正面 / 负面 / 中性” 的分类识别;系统会将情感分析结果与电影关联存储,既在界面展示影评情感分布(如正面影评占比),也为后续推荐提供 “情感偏好” 维度的数据支撑,让推荐更贴合用户真实态度。
(3)数据可视化展示(Echarts)
借助Echarts 可视化工具实现多维度电影数据呈现,覆盖多种图表类型:
用柱状图展示不同类型电影的数量 / 评分对比,南丁格尔玫瑰图直观呈现电影类型分布权重;
面积图与曲线图分析电影评分随年份的变化趋势;
散点图探索 “年份 - 类型 - 评分” 三者的关联关系(如某年份某类型电影的评分集中区间);
所有图表均集成于前端界面,帮助用户快速把握电影市场规律,降低数据理解门槛。
(4)个性化推荐(双协同过滤)
采用基于用户 + 基于物品的双协同过滤推荐算法:
基于用户的协同过滤:计算用户间的观影偏好与情感评价相似度,为目标用户推荐 “相似用户喜欢且情感评价正面” 的电影;
基于物品的协同过滤:分析电影间的类型、评分、用户情感反馈相似度,推荐与用户已看电影风格相近的作品;
两种算法结合,有效弥补单一推荐的局限性,同时融入 LSTM 情感分析结果,进一步提升推荐精准度。
(5)前后端架构与用户交互
前端(Vue):构建简洁美观的交互界面,包含电影数据展示、情感分析结果查看、推荐列表浏览、注册登录等模块,适配不同设备屏幕,提升用户操作体验;
后端(Flask):负责爬虫任务调度、LSTM 模型运行、推荐算法计算与数据库交互,通过 API 接口与前端实现数据同步,保障系统功能稳定运行。
整体而言,系统不仅实现了电影数据的高效利用,更通过 “情感分析 + 双算法推荐” 突破传统推荐的局限,为用户提供 “懂喜好、知情感” 的个性化观影服务,同时为电影行业分析用户态度提供数据参考,具备较强的技术深度与实用价值。

4、核心代码

import json
import os
import random
import time

from flask import Flask, request, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from sqlalchemy.sql import func

from api.alipayApi import payBp
from api.baiduApi import idocr
from api.movieApi import movieBp
from api.orderApi import orderBp
from base.code import ResponseCode
from base.core import JSONEncoder
from base.response import ResMsg
from api.testApi import bp
from api.userApi import userBp

import logging

from deeplearning.predict_lstm import sentimentalAnalysis_single
from models.movie import getWords

# Flask配置
from utils.smsutil import Sms

app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/test')
# 注册用户相关的方法
app.register_blueprint(userBp, url_prefix='/user')
# 注册电影相关的方法
app.register_blueprint(movieBp, url_prefix='/movie')
app.register_blueprint(payBp, url_prefix='/alipay')
app.register_blueprint(orderBp, url_prefix='/order')  # 订单接口

# 数据库配置信息
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/flask_douban_comment'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 前端返回的JSON用ASCII编码关闭,否则浏览器里面看到的文本会是乱码
app.config['JSON_AS_ASCII'] = False
# Flask必须的配置
app.config['SECRET_KEY'] = 'KJDFLSjfldskj'


UPLOAD_FOLDER="upload"
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
basedir = os.path.abspath(os.path.dirname(__file__))
ALLOWED_EXTENSIONS = set(['txt','png','jpg','xls','JPG','PNG','gif','GIF'])

# 日志系统配置
# handler = logging.FileHandler('./error.log', encoding='UTF-8')
# logging_format = logging.Formatter(
#             '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
# handler.setFormatter(logging_format)
# app.logger.addHandler(handler)

# 返回json格式转换 使用这个的话就不需要每次都写json返回了,简化代码
app.json_encoder = JSONEncoder

# SQLAlchemy 为ORM框架,即用来简化操作数据库的包,具体内容需要学习ORM相关知识
db = SQLAlchemy(app)
# Marshmallow 是用来封装返回SQLAlchemy 的返回结果的,通过这个包可以直接把数据转成JSON,从而返回给前端使用
ma = Marshmallow(app)

# 一个测试的方法,可以测试服务器是否启动了
@app.route('/test')
def test():  # put application's code here
    res = ResMsg()
    test_dict = dict(name="zhang", age=19)
    res.update(data=test_dict, code=0)
    # data = dict(code=ResponseCode.SUCCESS,
    #             msg=ResponseMessage.SUCCESS,
    #             data=test_dict)
    return res.data
    # return jsonify(res.data)

# 用来捕捉服务器运行过程中的500-内部错误,并给前端返回信息
@app.errorhandler(500)
def special_exception_handler(error):
    app.logger.error(error)
    return '请联系管理员', 500

#判断文件后缀
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS

@app.route('/file/upload', methods=['POST'], strict_slashes=False)
def api_upload():
    res = ResMsg()
    file_dir=os.path.join(basedir, app.config['UPLOAD_FOLDER'])
    if not os.path.exists(file_dir):
        os.makedirs(file_dir)
    f = request.files['myfile']
    if f and allowed_file(f.filename):
        fname = f.filename
        # fname = secure_filename(f.filename)
        print(fname)
        ext = fname.rsplit('.', 1)[1]
        unix_time = int(time.time())
        new_filename = str(unix_time)+'.'+ext
        f.save(os.path.join(file_dir, new_filename))
    res.update(data=new_filename, code=0)
    return res.data

@app.route('/file/idocr', methods=['POST'], strict_slashes=False)
def api_id_ocr():
    res = ResMsg()
    file_dir=os.path.join(basedir, app.config['UPLOAD_FOLDER'])
    if not os.path.exists(file_dir):
        os.makedirs(file_dir)
    f = request.files['myfile']
    if f and allowed_file(f.filename):
        fname = f.filename
        # fname = secure_filename(f.filename)  有中文这个会有问题
        # print(fname)
        ext = fname.rsplit('.', 1)[1]
        unix_time = int(time.time())
        new_filename = str(unix_time)+'.'+ext
        f.save(os.path.join(file_dir, new_filename))
        current_path = os.path.dirname(__file__)

        idno, name = idocr(current_path + '/upload/' + new_filename)
    res.update(data=dict(idno=idno,pic=new_filename,name=name), code=0)
    return res.data

@app.route('/file/download/<filename>/')
def api_download(filename):
    # print('下载..' + filename)
    return send_from_directory('upload', filename, as_attachment=False)

#阿里云短信接口
@app.route('/sms/sendSms', methods=['POST'])
def sendSms():
    res = ResMsg()
    phone = request.json['phone']
    code = random.randint(100000, 999999)
    response = json.loads(Sms().sendCode(phone, code))
    if response['Code'] == "OK":
        res.update(msg="发送成功", code=0, data=code)
    else:
        res.update(msg="发送失败", code=-1)
    return res.data

# 深度学习情感分析接口
@app.route('/deeplearning/senti_single', methods=['POST'])
def senti_single():
    res = ResMsg()
    data = request.json['data']
    datas = [data]
    print(datas)
    result = sentimentalAnalysis_single(datas)
    res.update(msg="成功", code=0, data=result)
    return res.data

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0',port=8080)

🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐