博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

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

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

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

2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅

1、项目介绍(原样)

技术栈:
Python语言、Django框架 、MySQL数据库、Vue框架、Scrapy爬虫、Echarts可视化、懂车帝网数据

这款汽车信息网站是基于多项技术和框架设计的全面的汽车信息展示及查询系统。其中,采用了Python Django框架和Scrapy爬虫技术实现数据的抓取和处理,结合MySQL数据库进行数据存储和管理,利用Vue3、Element-Plus、ECharts以及Pinia等前端技术实现了丰富的数据可视化展示和用户交互功能。

研究背景:国内汽车线上信息分散,口碑、销量、降价、投诉等数据孤岛严重,消费者选车需跨多平台比对,耗时费力且易被广告误导;厂商亦缺乏一站式公开数据参考,难以精准定位用户痛点。

研究意义:项目聚合多源数据并可视化,实现“选车-比车-购车”闭环,可嵌入4S店大屏、二手车平台或个人毕设,直接降低决策成本,提升交易效率,具有落地商业价值与教学示范双重价值。

2、项目界面(原样)

(1)汽车数据、条件筛选汽车
在这里插入图片描述

(2)汽车数据详情页
在这里插入图片描述
在这里插入图片描述

(3)销量排行榜
在这里插入图片描述

(4)差评榜单
在这里插入图片描述

(5)可视化分析
在这里插入图片描述

(6)后台数据管理
在这里插入图片描述

(7)注册登录
在这里插入图片描述

(8)数据采集
在这里插入图片描述

3、项目说明

关键词/摘要:懂车帝+车质网双源数据、Scrapy实时抓取、Django REST API、Vue3+Element-Plus、ECharts多维度可视化、销量/降价/投诉三榜联动、雷达图评分、词云故障、时间序列追踪、SimpleUI后台、用户画像、一键条件选车、毕设级代码开源。

项目围绕“让选车像点外卖一样简单”的目标,构建“数据-算法-交互”闭环。Scrapy每日增量爬取懂车帝30万+车系与销量、车质网5万+投诉,经过去重、归一、情感分析后入库;MySQL分区存储保证千万级数据秒级响应。后端以Django为核,封装30+ REST接口,采用JWT+Redis实现登录态与高频缓存;编写可插拔中间件,支持异步导出Excel、生成PDF报告。前端用Vue3<-WEIXIN->构建SPA,Pinia集中管理筛选项、对比车系、用户足迹,实现“条件选车-加入对比-生成分享海报”一条龙。

可视化是亮点:销量榜按近一年/半年/月动态排行,差评榜细分质量/服务/其他并支持负面词云穿透;降价榜用柱状图直观展示官方价与终端价差;雷达图从舒适、外观、配置等六维解析车系竞争力;时间轴追踪单车型投诉与销量走势,辅助判断“投诉暴增是否影响销量”。后台SimpleUI让零代码管理员也能完成新增车系、批量调价、舆情标注。系统已验证可支撑1000并发,页面平均响应<300 ms,可无缝移植到二手车平台、汽车媒体或校内创新实训,兼具商业落地与教学示范双重价值。

4、核心代码


from django.shortcuts import render
from datetime import datetime, timedelta
from .models import *
from django.http.response import JsonResponse
from itertools import groupby
from .models import *
import json
from django.http.response import HttpResponse
from django.shortcuts import render
from django.http import JsonResponse
from pyecharts import options as opts
from pyecharts.charts import Map, Grid, Bar, Line, Pie, WordCloud, Radar, Timeline
from pyecharts.faker import Faker
from pyecharts.commons.utils import JsCode
from pyecharts.options.charts_options import MapItem
from datetime import datetime, time
from django.core.paginator import Paginator
from django.db.models import Q, F
from pyecharts.globals import SymbolType
from django.db.models import Sum, Count, Max, Min, Avg
from collections import Counter
from requests_html import requests
from itertools import chain
from functools import lru_cache


def car_sales_rank(request):
    # 获取请求体中的数据
    body = request.json
    # 获取请求体中的月份
    month = body.get("month")
    # 定义查询条件
    q = Q()
    # 根据月份设置查询条件
    if month == "1y":
        # 获取当前日期及1年前的日期
        today = datetime.now().date()
        one_year_ago = today - timedelta(days=365)
        # 设置查询条件
        q &= Q(
            month__gte=one_year_ago.strftime("%Y%m"), month__lte=today.strftime("%Y%m")
        )
    elif month == "6m":
        # 近半年,即6个月
        today = datetime.now().date()
        half_year_ago = today - timedelta(days=365 // 2)
        # 设置查询条件
        q &= Q(
            month__gte=half_year_ago.strftime("%Y%m"), month__lte=today.strftime("%Y%m")
        )
    else:
        q &= Q(month=month)
    # 统计各个车系一年内的总销量,并按照销量进行排序和排名
    result = (
        CarSale.objects.filter(q)
        .values("series_id", "series_name")
        .annotate(total_sales=Sum("rank_value"))
        .order_by("-total_sales")
    )
    # 对结果进行排名
    result_list = list(result)
    for i, item in enumerate(result_list):
        item["sales_rank"] = i + 1
    # 分页处理数据
    pagesize = body.get("pagesize", 20)
    page_num = body.get("page", 1)
    paginator = Paginator(result_list, pagesize)  # 创建Paginator对象
    page = paginator.get_page(page_num)  # 获取指定页码的数据
    result = list(page.object_list)
    # 获取每个车系的详细信息,并将其添加到结果中
    for i in result:
        car_series = to_dict([CarSeries.objects.get(series_id=i["series_id"])])[0]
        i.update(**car_series)
    # 返回分页后的结果
    return JsonResponse({"total": paginator.count, "records": result})


def car_issue_rank(request):
    body = request.json
    stime = body.get("stime")
    type = body.get("type")
    q = Q()
    if stime == "1y":
        # 获取当前日期及1年前的日期
        today = datetime.now().date()
        one_year_ago = today - timedelta(days=365)
        q &= Q(
            stime__gte=one_year_ago.strftime("%Y-%m-%d"),
            stime__lte=today.strftime("%Y-%m-%d"),
        )
    elif stime == "6m":
        # 近半年,即6个月
        today = datetime.now().date()
        half_year_ago = today - timedelta(days=365 // 2)
        q &= Q(
            stime__gte=half_year_ago.strftime("%Y-%m-%d"),
            stime__lte=today.strftime("%Y-%m-%d"),
        )
    else:
        q &= Q(stime=stime)
    if type:
        q &= Q(type=type)
    # 统计各个车系一年内的总问题数,并按照问题数进行排序和排名
    result = (
        CarIssue.objects.filter(q)
        .values("series_id", "series_name")
        .annotate(total_issues=Sum("count"))
        .order_by("-total_issues")
    )

    # 对结果进行排名
    result_list = list(result)
    for i, item in enumerate(result_list):
        item["issues_rank"] = i + 1

    # 分页处理数据
    pagesize = body.get("pagesize", 20)
    page_num = body.get("page", 1)
    paginator = Paginator(result_list, pagesize)  # 创建Paginator对象
    page = paginator.get_page(page_num)  # 获取指定页码的数据
    result = list(page.object_list)
    for i in result:
        car_series = to_dict([CarSeries.objects.get(series_id=i["series_id"])])[0]
        counter = Counter()
        for x in CarIssue.objects.filter(q, series_id=i["series_id"]).values_list(
            "dxwt", flat=True
        ):
            counter.update(dict([(j["ctiTitle"], j["count"]) for j in x]))
        i["issues"] = counter.most_common(10)
        i.update(**car_series)
    return JsonResponse({"total": paginator.count, "records": result})


def get_detail(request):
    body = request.json
    id = body.get("id")
    o = CarSeries.objects.get(pk=id)
    o = to_dict(o, single=True)
    o["brand"] = to_dict(Brand.objects.get(brand_id=o["brand_id"]), single=True)
    return JsonResponse(o)


def car_360_color_pic(request):
    body = request.json
    id = body.get("id")
    try:
        color_pic_list = requests.get(
            f"https://www.dongchedi.com/motor/pc/car/series/car_360_color_pic?aid=1839&app_name=auto_web_pc&series_id={id}"
        ).json()["data"]["color_pic_list"]
    except:
        color_pic_list = []
    return JsonResponse(color_pic_list, safe=False)


def radar_chart(request):
    body = request.json
    id = body.get("id")
    # 从数据库中读取评分数据
    car_series = CarSeries.objects.get(series_id=id)
    color = "#f4cf63"
    # 转换数据范围
    min_score = 1
    max_score = 500
    scale = 5
    comfort_score = car_series.comfort_score / max_score * scale
    appearance_score = car_series.appearance_score / max_score * scale
    configuration_score = car_series.configuration_score / max_score * scale
    control_score = car_series.control_score / max_score * scale
    power_score = car_series.power_score / max_score * scale
    space_score = car_series.space_score / max_score * scale
    interiors_score = car_series.interiors_score / max_score * scale
    total_score = round(car_series.total_score / max_score * scale, 2)

def car_series_analysis(request):
    low_price_data = {}
    for i in range(7):
        low_price_data[str(i)] = 0
    for car_series in CarSeries.objects.all():
        if car_series.dealer_low_price is not None:
            if car_series.dealer_low_price < 10:
                low_price_data["0"] += 1
            elif car_series.dealer_low_price < 15:
                low_price_data["1"] += 1
            elif car_series.dealer_low_price < 20:
                low_price_data["2"] += 1
            elif car_series.dealer_low_price < 25:
                low_price_data["3"] += 1
            elif car_series.dealer_low_price < 30:
                low_price_data["4"] += 1
            elif car_series.dealer_low_price < 40:
                low_price_data["5"] += 1
            else:
                low_price_data["6"] += 1

    bar = (
        Bar()
        .add_xaxis(["0-10万", "10-15万", "15-20万", "20-25万", "25-30万", "30-40万", "50万以上"])
        .add_yaxis(
            "车系数量",
            [
                low_price_data["0"],
                low_price_data["1"],
                low_price_data["2"],
                low_price_data["3"],
                low_price_data["4"],
                low_price_data["5"],
                low_price_data["6"],
            ],
            bar_width=50,
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="价格范围数量分布图", pos_left="center", pos_top=0),
            legend_opts=opts.LegendOpts(is_show=False),
            xaxis_opts=opts.AxisOpts(
                name="价格范围",
                axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"),
            ),
            yaxis_opts=opts.AxisOpts(name="车系数量"),
        )
    )

    return HttpResponse(bar.dump_options(), content_type="aplication/json")

5、源码获取方式

biyesheji0005  或  biyesheji0001   (绿色聊天软件)

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐