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

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

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

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

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

1、项目介绍

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

研究背景:网络文学规模庞大,平台急需洞察题材趋势与作品热度。利用requests轻量爬虫抓取17k小说网多维度数据,结合Django+Echarts构建可视化分析平台,可在分钟级完成“爬取-存储-分析-大屏”闭环,为编辑选题、作者创作、读者选书提供量化决策依据。

研究意义:系统全程本地部署,保障数据合规;模块化代码支持接入其他文学平台,适合作为“数据分析”“Web开发”课程实践与毕业设计模板,推动大数据在网文领域的教学落地与产业应用。

2、项目界面

(1)各类型小说数据可视化分析
在这里插入图片描述

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

(3)各类型小说数量分析
在这里插入图片描述

(4)新作品点击榜分析
在这里插入图片描述

(5)词云图分析
在这里插入图片描述

(6)小说数据列表
在这里插入图片描述

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

3、项目说明

17k小说数据分析可视化系统采用Django MVT+HTML前端:requests定时抓取网站小说名称、作者、类型、点击量、简介等多字段信息,经pandas去重清洗后存入SQLite;后端利用Django ORM提供分页、搜索、筛选接口,前端Echarts实现类型数量柱形图、月票房折线、新作品点击榜、词云等多维可视化,支持按类型、时间动态联动刷新。

数据爬取模块采用“requests+随机UA+异常重试”策略,绕过网站反爬,定时增量写入;清洗模块自动统一字段格式、填补缺失值,保证数据质量。词云图对小说简介分词后去除停用词,字体大小与词频正相关,点击词汇可下钻至对应小说列表;后台管理支持小说批量上下架、点击量手动修正、爬虫任务启停及日志查看,权限分级为超级管理员与数据员两级,确保运营安全。

系统全程本地运行,不依赖外网API,既保护数据隐私,又降低运维成本;代码开源且注释详尽,配套部署文档与演示数据,可作为“数据分析”“Web开发”课程实践案例,也可直接用于毕业设计、科研baseline,推动爬虫与可视化技术从理论走向生产,助力高校与企业快速构建属于自己的文学大数据平台。

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、源码获取方式

biyesheji0005  或  biyesheji0001   (绿色聊天软件)

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

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

Logo

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

更多推荐