17k小说爬虫与可视化项目 小说数据分析可视化 Python requests+Django+Echarts 毕业设计✅
博主介绍:✌全网粉丝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 (绿色聊天软件)
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻
更多推荐



所有评论(0)