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

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

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

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

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

1、项目介绍

技术栈:
Python语言、Django框架、requests爬虫、Echarts可视化、HTML、17k小说网

2、项目界面

(1)各类型小说数据可视化分析

在这里插入图片描述

(2)月票房前20分析
在这里插入图片描述

(3)各类型小说数量分析
在这里插入图片描述
(4)新作品点击榜分析

在这里插入图片描述

(5)词云图分析

在这里插入图片描述

(6)小说数据列表

在这里插入图片描述

(7)后台数据管理

在这里插入图片描述

3、项目说明

一、技术栈
本项目采用了以下技术栈进行开发:

编程语言:Python,一种解释型、面向对象的高级程序设计语言,具有简洁易读、学习曲线平缓的特点,非常适合于数据分析和Web开发。
框架:Django,一个用Python编写的高级Web框架,它允许快速开发安全和维护性高的网站,提供了丰富的功能和组件,大大简化了Web应用的开发过程。
爬虫技术:requests,一个简单易用的HTTP库,用于从17k小说网等网站抓取小说数据。
可视化工具:Echarts,一个使用JavaScript实现的开源可视化库,能够轻松实现数据的图形化展示,提升数据的可读性和理解度。
前端技术:HTML,用于构建网页的基本结构和内容,是Web开发的基础。
数据源:17k小说网,作为本项目的数据来源,提供了丰富的小说资源供我们进行抓取和分析。

二、项目界面与功能模块介绍
各类型小说数据可视化分析
通过图表展示不同类型小说的阅读量、评分等数据,帮助用户了解各类型小说的受欢迎程度。
月票房前20分析(注:此处可能与小说数据不直接相关,可能是项目中的一个额外功能或误植,但为保持原文完整性,仍进行翻译)
展示某个月份内阅读量或评分排名前20的小说,分析这些小说的特点和受欢迎的原因。
各类型小说数量分析
统计并展示不同类型小说的数量,帮助用户了解小说市场的分布和趋势。
新作品点击榜分析
展示新发布小说的点击量排名,分析新作品的受欢迎程度和市场潜力。
词云图分析
通过词云图展示小说中的关键词或高频词,帮助用户了解小说的主题和内容特点。
小说数据列表
展示抓取到的小说数据列表,包括小说名称、作者、类型、简介等基本信息,方便用户进行查找和筛选。
后台数据管理
提供后台管理界面,用于管理抓取到的小说数据、用户数据、日志数据等,确保数据的准确性和安全性。同时,后台管理界面还提供了数据导出、数据清洗等功能,方便用户进行进一步的数据分析和处理。
通过以上功能模块,本小说数据分析可视化系统为用户提供了全面的数据分析服务,帮助用户了解小说市场的趋势和变化,为小说创作和推广提供有力的数据支持。

4、核心代码

from django.shortcuts import render,HttpResponse,reverse,redirect
from django.contrib.auth.decorators import login_required
from guanli import models
from django.db.models import Q
from django.shortcuts import get_object_or_404,HttpResponseRedirect

# Create your views here.

@login_required
def index(request):
    if request.method == 'GET':
        Search = request.GET.get('Search')
        if Search:
            datas = models.XinXi.objects.filter(book_name__icontains=Search).order_by('-id')
        else:
            datas = models.XinXi.objects.all().order_by('-id')

        return render(request,r"apps\book_all.html",locals())



@login_required
def user_profile(request):
    if request.method == 'GET':
        return render(request,'apps/user-profile.html',locals())
    elif request.method == 'POST':
        datas = models.Users.objects.get(username=request.user.username)
        error = {}
        data = request.POST
        email = data.get('email', '')
        if email != '' and '@' in str(email):
            email = email
        else:
            error['email'] = '邮箱格式错误'
        age = data.get('age', '')
        try:
            int(age)
            if age != '' and 0 < int(age) and int(age) < 120:
                age = age
            else:
                raise Exception('年龄错误')
        except:
            error['age'] = '年龄错误'
        set = data.get('set', '')
        if set != '' and str(set) in ['男', '女']:
            set = set
        else:
            error['set'] = '性别格式错误'
        mob = data.get('mob')
        if error != {}:
            return render(request, 'app/user-profile.html', context={'data': datas, 'error': error})
        else:
            models.Users.objects.filter(username=request.user.username).update(email=email, age=age, set=set,mob=mob)
            user = request.user
            return redirect('web:user_profile')


@login_required
def yuedurenshu_all(request):
    if request.method == 'GET':
        datas = models.XinXi.objects.all()
        list11 = [i.types for i in datas]
        types = list(set(list11))
        type_name = []
        type_count = []
        for resu in types:
            type_name.append(resu)
            da1 = models.XinXi.objects.filter(types=resu)
            count = 0
            for da2 in da1:
                count += da2.yuedu
            type_count.append(count)

        return render(request,r"apps\yuedurenshu.html",locals())



@login_required
def keshihua(request):
    if request.method == 'GET':
        datas = models.XinXi.objects.all()
        list11 = [i.types for i in datas]
        types = list(set(list11))
        type_name = []
        type_count = []
        for resu in types:
            type_name.append(resu)
            type_count.append(list11.count(resu))

        #月票数
        yuepiaoshus = models.BangDan_xinxi.objects.filter(leixing='推荐票榜').order_by('-tuijian')
        yuepiaoshu_name = []
        yuepiaoshu_count = []
        for resu in yuepiaoshus[:20]:
            yuepiaoshu_name.append(resu.book_name)
            yuepiaoshu_count.append(resu.tuijian)

        #男生类型数
        list22 = [i.types for i in datas if i.sets == '男生']
        types12 = list(set(list22))
        nan_count = []
        for resu in types12:
            nan_count.append({"name":resu,"value":list22.count(resu)})

        #女生类型数
        list22 = [i.types for i in datas if i.sets == '女生']
        types12 = list(set(list22))
        nv_count = []
        for resu in types12:
            nv_count.append({"name":resu,"value":list22.count(resu)})

        #畅销榜
        changxiaos = models.BangDan_xinxi.objects.filter(leixing='畅销榜').order_by('-id')
        changxiao_name = []
        changxiao_count = []
        for resu in changxiaos:
            changxiao_name.append(resu.book_name)
            changxiao_count.append(resu.dianji)

        #新作品点击榜
        new_zuopings = models.BangDan_xinxi.objects.filter(leixing='新作品点击榜').order_by('-id')
        new_zuoping_name = []
        new_zuoping_count = []
        for resu in new_zuopings[:20]:
            new_zuoping_name.append(resu.book_name)
            new_zuoping_count.append(resu.dianji)

        #完本榜
        wangbens = models.BangDan_xinxi.objects.filter(leixing='完本榜').order_by('-id')
        wangben_name = []
        wangben_count = []
        for resu in wangbens[:20]:
            wangben_name.append(resu.book_name)
            wangben_count.append(resu.dianji)

        #收藏榜
        shouchangs = models.BangDan_xinxi.objects.filter(leixing='完本榜').order_by('-id')
        shouchang_name = []
        shouchang_count = []
        for resu in shouchangs[:20]:
            shouchang_name.append(resu.book_name)
            shouchang_count.append(resu.dianji)


        return render(request,r"apps\keshihua.html",locals())



@login_required
def ciyuntu(request):
    if request.method == 'GET':
        return render(request,r"apps\ciyuntu.html",locals())





def runoob(request):
    context = {}
    context['hello'] = 'Hello World!'
    return render(request, 'index.html', context)

5、源码获取方式

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

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

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐