💗博主介绍:✌全网粉丝20W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者,计算机毕设实战导师。目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌
💗主要服务内容免费功能设计、选题定题、开题报告、任务书、程序开发、论文编写和辅导、论文降重、程序讲解、答辩辅导等,欢迎咨询~
👇🏻 精彩专栏 推荐订阅👇🏻
计算机毕业设计精品项目案例(持续更新,值得收藏!)✅
2026-2027年计算机毕业设计选题推荐:计算机专业毕业设计题目大全✅
全网最全计算机毕业设计选题推荐:计算机毕设选题指导及避坑指南✅
🌟文末获取源码+数据库+文档🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以和学长沟通,希望帮助更多的人

一.项目概述

随着新能源汽车产业高速发展,市场车型资源海量激增,传统选车模式难以适配用户个性化需求,同时汽车平台存在供需匹配精度低、数据利用效率不足等问题。针对该现状,本文设计并实现了一款融合爬虫技术、深度学习与数据可视化的新能源汽车智能推荐系统。
本系统基于Python爬虫技术抓取懂车网新能源汽车数据,经数据清洗预处理后存入MySQL数据库,构建完善的行业数据集。依托TensorFlow深度学习框架,结合基于用户的协同过滤算法,挖掘用户浏览、收藏等行为特征,聚类相似偏好用户,实现车型个性化精准推荐。系统采用Django前后端分离架构,保障业务运行高效稳定。面向普通用户提供智能推荐、车型查询、互动评论、数据可视化看板等功能,面向管理员搭建数据调度、信息管理等后台运维模块。本系统能够有效提升车型推荐精准度,优化用户选车体验,同时为新能源汽车平台智能化运营提供高效、可行的技术方案。


二.开发技术栈

2.1 基础环境

开发语言:后端 Python,前端 Vue
数据库:MySQL 5.7,保障数据存储与版本兼容性
项目构建工具:Python pip、前端 npm
开发工具:PyCharm、VS Code、Navicat

2.2 核心技术架构

前端框架:采用 Vue 开发页面,实现交互展示与功能操作。
数据采集层:基于 Requests、Scrapy 编写爬虫,自动化采集网络数据。
数据处理层:依托 Python、Pandas、NumPy 完成数据清洗、运算与规整。
服务应用层:后端使用 Flask 搭建 Web 服务,提供接口支撑前端调用。
数据存储层:采用 MySQL 5.7 持久化存储采集、加工后的业务数据。


三.系统分析

3.1 需求分析与角色划分

3.1.1 总体功能需求

本文所设计的新能源汽车推荐系统围绕用户智能化选车与平台规范化运营两大核心目标展开,融合网络爬虫、深度学习、数据可视化及前后端分离开发技术,整合数据采集、数据处理、智能推荐、信息展示、交互互动、后台运维等多元化功能。系统整体功能可划分为用户前端功能与管理员后台功能两大板块,全面覆盖普通用户选车查阅、个性化推荐、资讯浏览、互动交流及数据可视化分析需求,同时满足管理员账号运维、车型信息管理、资讯维护、爬虫数据调度、品牌与公告管控等后台运营需求。整体功能设计遵循实用性、智能化、稳定性与易用性原则,通过权限隔离实现用户端与管理端业务互不干扰,依托深度学习算法实现精准个性化推荐,借助爬虫技术保障平台数据实时更新、真实可靠,利用数据可视化技术实现数据直观展示,全方位提升用户使用体验与平台智能化管理水平,可有效解决新能源汽车车型信息繁杂、用户选车效率低、供需匹配不精准、平台运维繁琐等行业痛点。

3.1.2 角色划分

结合系统业务与使用人群,划分两类核心角色:普通用户、系统管理员,两类角色权限相互隔离,各司其职,覆盖平台使用、运营、数据维护全场景。其中,普通用户为系统核心使用群体,主要依托平台完成新能源汽车查询、个性化选车、资讯浏览、互动交流等操作;系统管理员为平台运维主体,拥有系统最高操作权限,主要负责平台数据更新、信息审核、内容管理、爬虫调度、权限管控等后台运维工作。两类角色权责清晰、功能边界明确,可全方位支撑系统稳定运行与常态化运营。

3.1.3 各角色细分功能需求

(1)管理员功能需求
系统管理员作为平台运营管控核心角色,拥有独立后台登录权限,区别于普通用户权限体系,可全方位维护平台内容、数据与系统运行状态,具体细分功能需求如下:
1.管理员登录功能:通过专属账号密码验证机制进入后台管理系统,依托独立权限体系规避非法访问,保障后台数据与运维安全。
2. 系统首页数据统计功能:可直观查看平台用户总量、新能源汽车车型数量、车圈资讯数量、平台访问量等核心运营数据,通过可视化数据快速掌握平台整体运营态势。
3. 新能源汽车管理功能:支持手动新增、批量删除车辆信息,同时可调度爬虫程序爬取懂车网公开车型数据,完成数据清洗与模型迭代训练,持续更新平台车型资源,优化智能推荐效果。
4. 车圈信息管理功能:可自主新增、批量删除车圈资讯,远程爬取懂车网行业资讯与测评内容,对原始数据进行清洗过滤,筛选优质内容供用户浏览。
5. 爬取数据管理功能:支持后台手动启动爬虫任务,批量采集懂车网车型、资讯等数据,实时反馈爬取进度与完成状态,便于管理员把控数据更新节奏。
6. 品牌管理功能:可对新能源汽车品牌进行新增、编辑、删除与分类规整,统一平台品牌数据规范,保障前端车型分类展示清晰有序。
7. 公告管理功能:支持编写、发布系统官方公告,可批量清理过期、无效通知,及时向用户同步平台更新、数据迭代、行业重要通知等信息。
(2)用户功能需求
普通用户作为系统前端核心使用主体,可完成账号操作、车型查询、智能选车、资讯浏览、互动交流、数据查看等全流程操作,具体细分功能需求如下:
1.用户注册与登录功能:新用户可自主填写账号、设置并确认密码,系统完成密码一致性校验与信息加密存储,保障账号唯一性;已注册用户可通过账号密码验证登录系统,错误信息会触发登录失败提示,有效保障用户账号安全。
2. 个性化新能源汽车推荐功能:系统基于协同过滤算法与TensorFlow深度学习模型,采集用户浏览、收藏、评论等行为数据,构建精准用户偏好画像,实现车型个性化、智能化精准推荐。
3. 车型信息查看功能:用户可自由浏览平台全部新能源汽车,查阅车型价格、续航、配置、外观等详细参数,全方位了解车辆核心信息。
4. 资讯与公告查看功能:可进入车圈板块浏览行业动态、车型测评、汽车资讯,同时可查看官方发布的系统公告,实时掌握行业信息与平台动态。
5. 数据可视化查看功能:依托平台可视化看板,以图表形式直观查看汽车价格分布、品牌占比、热门车型等统计数据,为选车决策提供数据参考。
6. 收藏与互动功能:用户可收藏心仪车型并在个人中心统一管理,便于后续对比查阅;同时可对车型发表评价、分享购车体验,也可浏览其他用户评论,实现用户间良性互动。
7. 原始数据查看功能:可查看平台同步的懂车网原始车型资料、测评数据与行业资讯,依托权威数据源保障选车参考信息的真实性与可靠性。

3.2 用例设计

结合业务需求绘制管理员用例图、用户用例图,清晰定义各角色可执行操作:

在这里插入图片描述

在这里插入图片描述

3.3 系统功能模块设计

功能模块设计以权限划分为主线:前台侧围绕信息浏览与互动参与组织模块,后台侧围绕数据维护与内容治理组织模块。为了使模块关系更清晰,系统总体结构以数据采集层—数据处理层—存储结构层—业务服务层—展示交互层的思路组织,并以看板作为展示交互层的重要组成。系统总体结构图如图所示。

在这里插入图片描述

四.数据采集与预处理

4.1 新能源汽车数据爬取

本系统基于Scrapy框架开发chequaninfoSpider专属爬虫,定向采集懂车网车圈资讯数据。爬虫配置自定义异常处理机制,兼容400、403等客户端异常状态码,针对500、503服务器异常配置自动重试策略,大幅提升数据采集稳定性。爬虫以懂车网官方资讯接口为数据源,通过链接解析、参数分割完成初始化配置,支持实时在线爬取与本地数据加载两种工作模式。程序可自适应Windows、Linux运行环境,非实时模式下优先读取本地数据库缓存,避免重复爬取资源损耗;实时模式下可自动分页构造请求链接,批量采集车圈动态、车友帖子、行业资讯等内容,为系统数据展示、清洗处理及推荐模型训练提供可靠的原始数据支撑。

4.2 新能源汽车数据预处理

为消除原始爬虫数据冗余、缺失、异常等问题,本文基于pandas与numpy库搭建标准化数据预处理模块,为模型训练与前端展示提供高质量合规数据。系统通过数据库引擎连接MySQL,读取原始车圈数据并转换为DataFrame格式,便于批量智能化处理。数据清洗流程包含三重核心操作,首先自动甄别并删除重复数据,解决数据冗余问题;其次清理严重空值无效数据,对轻微缺失字段统一填充“暂无”,保障数据完整性与页面展示效果;最后结合值域筛选与3σ正态分布原则双重校验,精准剔除各类异常数据,规范数据分布规律,最终获得规整、有效、适配模型训练的标准化数据集。

五.部分效果展示

5.1 用户功能模块

5.1.1 用户注册与登录

用户注册界面支持用户自主填写账号、密码及个人相关信息,系统自动完成数据校验与加密存储,顺利完成账号注册创建。如下图所示。
在这里插入图片描述

5.1.2 新能源汽车推荐

该界面依托协同过滤与深度学习算法实现个性化车型推荐,集中展示车型品牌、价格、销量、热度等核心信息,达成精准智能推送效果。如下图所示。
在这里插入图片描述

5.1.3 新能源汽车查看

界面以卡片式布局展示全量新能源汽车资源,清晰呈现车型参数、销量、热度等数据,支持用户全方位查阅车辆详细信息。如下图所示。
在这里插入图片描述

5.1.4 车圈信息查看

车圈界面集中展示用户帖子、行业资讯等内容,包含点赞、评论、发布时间等数据,支持详情查阅,满足用户资讯浏览与互动需求。如下图所示。

在这里插入图片描述

5.1.5 系统公告查看

该界面按时间排序展示管理员发布的官方公告,涵盖系统更新、运维通知、行业政策等内容,方便用户及时掌握平台动态。如下图所示。
在这里插入图片描述

5.1.6 数据可视化

可视化看板通过多类图表直观展示车型销量、数据分布、用户行为等统计数据,为用户选车决策提供直观的数据参考依据。如下图所示。
在这里插入图片描述

5.1.7 车型收藏

收藏模块整合展示用户收藏的心仪车型,支持随时查看与管理,实现个性化车型留存,方便用户后续对比选车。如下图所示。
在这里插入图片描述

5.1.8 用户评论

系统支持用户对车型发布评分与文字评论,评论数据实时入库展示,搭建用户交流渠道,实现购车经验与看法互动共享。如下图所示。
在这里插入图片描述

5.2 管理员功能模块

5.2.1 管理员登录

管理员通过专属账号密码完成身份核验,验证成功即可进入后台管理系统,依托权限隔离机制保障后台运维安全。如下图所示。
在这里插入图片描述

5.2.2 管理首页

后台首页以可视化图表展示平台用户量、车型数量、资讯量、销量数据等核心运营指标,直观反馈平台整体运行状态。如下图所示。
在这里插入图片描述

5.2.3 新能源汽车管理

该模块支持管理员新增、删除车辆信息,可调度爬虫采集数据、执行数据清洗与模型训练,实现车型数据与推荐模型的迭代优化。如下图所示。
在这里插入图片描述

5.2.4 车圈信息管理

管理员可自主新增、批量删除车圈资讯,同步完成外网数据爬取与清洗工作,保障平台资讯内容合规、实时、优质。如下图所示。
在这里插入图片描述

5.2.5 品牌管理

品牌管理模块支持对汽车品牌进行新增、编辑与删除操作,统一规范品牌分类,保证前端车型分类展示清晰有序。如下图所示。
在这里插入图片描述

5.2.6 公告管理

管理员可新增、编辑、批量删除系统公告,统一管控平台官方通知内容,实现公告信息的实时更新与规范发布。如下图所示。

在这里插入图片描述

六.部分代码实现

6.1 项目开发核心技术难点说明

难点 1:新能源汽车多源数据爬虫采集与高精度清洗处理
基于Scrapy框架实现懂车网多页面、多模块分层爬取,适配车型数据、车圈资讯等不同类型URL结构,兼容Windows与Linux双运行环境。针对网页冗余标签、杂乱格式、空值异常、重复数据等问题完成批量过滤与容错处理,结合3σ异常校验机制完成数据提纯。同时适配MySQL数据库结构完成数据表前置校验,有效解决外网数据杂乱、格式不统一、噪声数据多的难题,保障采集数据规范、有效、可直接用于模型训练。
难点 2:新能源汽车多维度数据可视化大屏动态构建
基于清洗后的海量新能源汽车数据,对车型价格、品牌占比、续航里程、销量分布、用户热度等多维度指标进行统计聚合与数据分析。依托Vue可视化组件实现动态图表渲染,解决新能源汽车数据维度繁杂、数据量级大、实时更新滞后、统计口径复杂的展示难题,实现平台数据可视化、直观化、动态化呈现,为用户选车决策与管理员运营分析提供可靠的数据支撑。
难点 3:基于深度学习的个性化推荐模型精准优化
平台用户行为数据稀疏、用户偏好差异性大,传统协同过滤算法存在推荐精度不足、个性化程度弱的问题。本文结合TensorFlow深度学习框架融合用户浏览、收藏、评论等多维行为特征,完成用户偏好画像建模。通过相似用户聚类与模型迭代训练,解决传统推荐算法同质化推荐、适配性差的痛点,有效提升新能源汽车个性化推荐的精准度与适配性。

6.2 基于 Scrapy + Requests 实现数据采集核心代码

# 导入所需第三方库与模块
import re
import random
import platform
import json
import os
import time
import emoji
import requests
import pymysql
import pymssql
from urllib.parse import urlparse
import scrapy
# 导入当前爬虫项目的数据实体类
from ..items import xiangmuItem


class XiangmuSpider(scrapy.Spider):
    """
    房源数据爬虫
    功能:爬取列表页房源基础信息,再进入详情页抓取作者等信息
    支持 MySQL / SQL Server 双数据库适配、数据表存在性校验、URL 补全、HTML 标签过滤
    """
    # 爬虫唯一标识名称,启动爬虫命令:scrapy crawl xiangmuSpider
    name = 'xiangmuSpider'
    # 多起始地址用分号 ; 分隔,自动拆分
    spider_url = 'https://url网址'
    start_urls = spider_url.split(";")

    # 全局变量:协议头、域名,用于补全相对路径URL
    protocol = ''
    hostname = ''

    def __init__(self, *args, **kwargs):
        """
        爬虫初始化构造方法
        """
        super().__init__(*args, **kwargs)

    def parse(self, response):
        """
        列表页解析入口
        1. 解析域名与协议,用于拼接完整URL
        2. 数据库校验:若数据表已存在则直接终止本次爬取
        3. 遍历列表数据,提取基础字段并跳转详情页
        :param response: 列表页响应对象
        :return: 详情页请求对象
        """
        # 解析起始URL,拆分协议、主机名
        url_parse_result = urlparse(self.spider_url)
        self.protocol = url_parse_result.scheme
        self.hostname = url_parse_result.netloc

        # 根据操作系统判断执行逻辑
        sys_platform = platform.system().lower()
        if sys_platform in ("linux", "windows"):
            # 建立数据库连接
            db_conn = self.db_connect()
            db_cursor = db_conn.cursor()

            # 校验目标数据表是否已存在
            if self.table_exists(db_cursor, "xiangmu") == 1:
                # 表已存在,关闭数据库资源,执行临时数据逻辑并终止爬取
                db_cursor.close()
                db_conn.close()
                self.temp_data()
                return

        # 定位列表页所有房源节点
        item_list = response.css('ul.subject-list li.subject-item')

        # 遍历每一条房源数据
        for node in item_list:
            # 实例化Item对象,用于封装爬取字段
            item = xiangmuItem()

            # 1. 抓取来源链接
            source_url = node.css('div.pic a.nbg::attr(href)').extract_first()
            # 去除HTML标签与空白字符
            item["laiyuan"] = self.remove_html(source_url)
            # 补全相对URL为完整可访问地址
            item["laiyuan"] = self.complete_url(item["laiyuan"])

            # 2. 抓取封面图地址
            cover_img = node.css('div.pic a.nbg img::attr(src)').extract_first()
            item["fengmian"] = self.remove_html(cover_img)

            # 3. 抓取房源简短名称/标题
            title = node.css('div.info h2 a::attr(title)').extract_first()
            item["xiaoshuoming"] = self.remove_html(title)

            # 详情页URL处理
            detail_url = node.css('div.pic a.nbg::attr(href)').extract_first()
            detail_url = self.complete_url(detail_url)
            # 同步更新来源地址为详情页地址
            item["laiyuan"] = detail_url

            # 发起详情页请求,将当前已抓取字段通过meta传递到详情解析函数
            yield scrapy.Request(
                url=detail_url,
                meta={"fields": item},
                callback=self.detail_parse,
                dont_filter=True  # 关闭去重,保证正常抓取
            )

    def detail_parse(self, response):
        """
        详情页解析函数
        抓取作者信息,整合所有字段后交付Pipeline入库
        :param response: 详情页响应对象
        :return: 封装完成的Item数据
        """
        # 接收列表页传递过来的Item数据
        item = response.meta["fields"]

        try:
            # 抓取作者信息
            author_text = response.css('div#info span a::text').extract_first()
            # 清洗HTML、空格、特殊符号
            item["zuozhe"] = self.remove_html(author_text)
        except Exception as e:
            # 异常捕获:作者字段抓取失败则置空,不中断整体爬取
            self.logger.warning(f"作者信息抓取异常: {str(e)}")
            item["zuozhe"] = ""

        # 将完整Item交给Scrapy管道,进行数据持久化
        yield item

    def remove_html(self, html_str):
        """
        工具方法:清除HTML标签、首尾空白字符
        :param html_str: 原始带标签字符串
        :return: 纯文本内容
        """
        if not html_str:
            return ""
        # 正则匹配所有HTML标签并替换为空
        html_pattern = re.compile(r'<[^>]+>', re.S)
        clean_text = html_pattern.sub('', html_str)
        # 去除首尾空格、换行
        return clean_text.strip()

    def complete_url(self, raw_url):
        """
        工具方法:统一补全相对URL为完整URL(修复原代码重复拼接逻辑)
        :param raw_url: 原始相对链接
        :return: 完整HTTP/HTTPS链接
        """
        if not raw_url:
            return ""
        # 已为完整链接,直接返回
        if raw_url.startswith(("http://", "https://")):
            return raw_url
        # 协议相对链接 //xxx.com
        if raw_url.startswith("//"):
            return f"{self.protocol}:{raw_url}"
        # 站点内相对链接 /xxx/xxx
        if raw_url.startswith("/"):
            return f"{self.protocol}://{self.hostname}{raw_url}"
        # 其他情况直接返回原字符串
        return raw_url

    def db_connect(self):
        """
        数据库连接方法
        读取Scrapy配置文件参数,支持 MySQL / SQL Server 两种数据库
        :return: 数据库连接对象
        """
        # 读取配置文件中的数据库类型、地址、端口、账号、密码
        db_type = self.settings.get("TYPE", "mysql")
        host = self.settings.get("HOST", "localhost")
        port = int(self.settings.get("PORT", 3306))
        user = self.settings.get("USER", "root")
        password = self.settings.get("PASSWORD", "123456")

        # 优先读取实例传参的数据库名,无则读取配置文件
        try:
            db_name = self.databaseName
        except AttributeError:
            db_name = self.settings.get("DATABASE", "")

        # 根据数据库类型创建连接
        if db_type == "mysql":
            conn = pymysql.connect(
                host=host,
                port=port,
                db=db_name,
                user=user,
                passwd=password,
                charset="utf8"
            )
        else:
            conn = pymssql.connect(
                host=host,
                user=user,
                password=password,
                database=db_name
            )
        return conn

    def table_exists(self, cursor, table_name):
        """
        工具方法:判断数据库中指定数据表是否存在
        :param cursor: 数据库游标对象
        :param table_name: 待校验表名
        :return: 1=表存在  0=表不存在
        """
        # 查询当前库下所有数据表
        cursor.execute("SHOW TABLES;")
        # 提取所有表名
        all_tables = cursor.fetchall()
        table_list = re.findall(r"('.*?')", str(all_tables))
        table_list = [t.replace("'", "") for t in table_list]

        return 1 if table_name in table_list else 0

    def temp_data(self):
        """
        临时数据处理逻辑(原代码预留方法,业务自定义)
        数据表已存在时执行此方法,可自行扩展逻辑
        """
        self.logger.info("目标数据表已存在,跳过新一轮爬取,执行临时数据逻辑")

源码及文档获取

文章下方名片联系我即可~
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
精彩专栏推荐订阅:在下方专栏👇🏻

最新计算机毕业设计选题篇-选题推荐
小程序毕业设计精品项目案例-200套
Java毕业设计精品项目案例-200套
Python毕业设计精品项目案例-200套
大数据毕业设计精品项目案例-200套
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。

更多推荐