import json
from typing import Iterator
import uuid
from flask import Flask
from time import sleep
from concurrent.futures import ThreadPoolExecutor
import DataBase
import re
import string
from flask import Flask, render_template
from flask import *
import json
import requests
from dm_pb2 import DmSegMobileReply
from google.protobuf.json_format import MessageToJson, Parse
import jieba
from pyecharts.charts import Geo,Bar,Pie,WordCloud,Boxplot,Line,Map
from pyecharts import options
from pyecharts.globals import SymbolType
class Data:
DataBase=None
data={}#弹幕与评论数据,请求ID为键,数据为值
# 创建线程池执行器
executor = ThreadPoolExecutor(10)
app = Flask(__name__)
##########################################################################
###################### Flask接口 ###########################
##########################################################################
#POST接口,提交任务——获取弹幕数据
@app.route('/submit_task_get_danmaku_data/<BVID>/',methods=["POST"])
def submit_task_get_danmaku_data(BVID):
requestID=str(uuid.uuid4())
executor.submit(long_task_of_get_danmaku_data,requestID,BVID)#创建异步获取弹幕长任务
submit_task_record_to_SQLite('get_danmaku_data',requestID)#提交任务记录到数据库
return json.dumps([{
'requestID':requestID ,
'status': 'create_danmaku_task_success'
}])
#GET接口,获取弹幕数据
@app.route('/get_danmaku_data/<requestID>/')
def get_danmaku_data(requestID):
if str(requestID) in Data.data:
return Data.data[str(requestID)]
else:
return json.dumps([{
'requestID':requestID ,
'status':"danmaku_data_don't_exist"
}])
##############################################################
#POST接口,提交任务获取TOP数据
@app.route('/submit_task_get_TOP20_data', methods=["POST"])
def submit_task_get_TOP20_data():
requestID=str(uuid.uuid4())
executor.submit(long_task_of_get_TOP20_data,requestID)#创建异步获取弹幕长任务
submit_task_record_to_SQLite('get_TOP20_data',requestID)#提交任务记录到数据库
return json.dumps([{
'requestID':requestID ,
'status': 'create_TOP20_task_success'
}])
#GET接口,获取TOP数据
@app.route('/get_TOP20_data/<requestID>/')
def get_TOP20_data(requestID):
if str(requestID) in Data.data:
return Data.data[requestID]
else:
return json.dumps([{
'requestID':requestID ,
'status':"TOP20_data_don't_exist"
}])
##############################################################
#POST接口,获取评论数据
@app.route('/submit_task_get_reply_data/<aid>/', methods=["POST"])
def submit_task_get_reply_data(aid):
requestID=str(uuid.uuid4())
executor.submit(long_task_of_get_reply_data,requestID,aid)#创建异步获取弹幕长任务
submit_task_record_to_SQLite('get_reply_data',requestID)#提交任务记录到数据库
return json.dumps([{
'requestID':requestID ,
'status': 'create_reply_task_success'
}])
#GET接口,获取评论数据
@app.route('/get_reply_data/<requestID>/')
def get_reply_data(requestID):
if str(requestID) in Data.data:
return Data.data[requestID]
else:
return json.dumps([{
'requestID':requestID ,
'status':"reply_data_don't_exist"
}])
##############################################################
#POST接口,提交任务保存所有数据
@app.route('/submit_task_save_all_data/<data>/', methods=["POST"])
def submit_task_save_all_data(data):
data=str(data).split("@");
bvid=data[0];
requestID_danmaku=data[1];
requestID_reply=data[2];
requestID=str(uuid.uuid4());
if str(requestID_danmaku) not in Data.data or str(requestID_reply) not in Data.data:
return json.dumps([{
'requestID':requestID,
'status': 'create_save_all_data_task_fail'
}])
else:
executor.submit(long_task_of_submit_task_save_all_data,requestID,bvid,requestID_danmaku,requestID_reply)#创建异步获取弹幕长任务
submit_task_record_to_SQLite('save_all_data',requestID)#提交任务记录到数据库
return json.dumps([{
'requestID':requestID ,
'status': 'create_save_all_data_task_success'
}])
##############################################################
#GET接口,获取长任务执行状态
@app.route('/get_task_status/<requestID>/')
def get_long_task_status(requestID):
return json.dumps([{
'requestID':requestID ,
'status':query_task_record_to_SQLite(requestID)
}])
###################### 网页模板GET接口 ###########################
#####################################################################
@app.route('/', methods=["GET"])
def home():
return render_template('index.html')
@app.route('/TOP20', methods=["GET"])
def TOP20():
return render_template('TOP20.html')
##############################################################
#GET接口,获取弹幕词云数据
@app.route('/get_danmaku_wordCloud/<requestID>/', methods=["GET"])#得到词云
def get_danmaku_wordCloud(requestID):
if str(requestID) not in Data.data:
return "<h1>警告!弹幕任务未完成,或数据已丢失!</h1>"
####开始处理####
dist=""
for i in Data.data[requestID]:
dist=dist+i["content"]+" "
pattern = re.compile(u"([\u4e00-\u9fff]+)")#正则表达式去除非中文字符
dist= pattern.findall(dist)
dist="".join(dist)
# print(dist)
seg_list =jieba.lcut(dist)
# print(seg_list)
wordcount = {}
for word in seg_list:
if len(word)>1:
wordcount[word] = wordcount.get(word, 0)+1
sorted_words=sorted(wordcount.items(), key=lambda x: x[1], reverse=True)[:100]#排序后词语
#######生成词云图##########
wordCloud=(WordCloud()
.add("",sorted_words,word_size_range=[10,100],shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=options.TitleOpts(title="弹幕关键词TOP100")))
wordCloud.render(path="danmaku_wordCloud.html")
#######生成词云图##########
return open("danmaku_wordCloud.html", "r").read()
####结束处理####
##############################################################
#GET接口,获取评论词云数据
@app.route('/get_reply_wordCloud/<requestID>/', methods=["GET"])#得到词云
def get_reply_wordCloud(requestID):
if str(requestID) not in Data.data:
return "<h1>警告!评论任务未完成,或数据已丢失!</h1>"
####开始处理####
dist=""
for i in Data.data[requestID]:
dist=dist+i["评论"]+" "
pattern = re.compile(u"([\u4e00-\u9fff]+)")#正则表达式去除非中文字符
dist= pattern.findall(dist)
dist="".join(dist)
# print(dist)
seg_list =jieba.lcut(dist)
# print(seg_list)
wordcount = {}
for word in seg_list:
if len(word)>1:
wordcount[word] = wordcount.get(word, 0)+1
sorted_words=sorted(wordcount.items(), key=lambda x: x[1], reverse=True)[:100]#排序后词语
#######生成词云图##########
wordCloud=(WordCloud()
.add("",sorted_words,word_size_range=[10,100],shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=options.TitleOpts(title="评论关键词TOP100")))
wordCloud.render(path="reply_wordCloud.html")
#######生成词云图##########
return open("reply_wordCloud.html", "r").read()
####结束处理####
##########################################################################
###################### 数据库操作 ###########################
##########################################################################
#提交记录写入到数据库
def submit_task_record_to_SQLite(task_name,requestID):
SQL="insert into main.task_record(id,task_name,requestID,status) values('%s','%s','%s','%s')"%(str(uuid.uuid4()),task_name,requestID,'waiting')
Data.DataB
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 实训项目-B站热门视频TOP20数据分析可视化系统源码(含实训报告+项目说明).zip 实训项目 1.前端由jinja模板引擎实现,用BootSharp5框架进行美化。<br>后端采用线程池,进行异步执行前端提交的任务,例如采集数据任务或词频统计任务。 2.该项目可以进行实时分析数据。数据库采用SQLite ,不需要部署。可以用Navicat打开。 3.该项目具体功能,可以看实训报告。可以分析弹幕,评论数据。 4.之后该项目将添加评论情感分析功能,基于LSTM或BERT深度学习模型(暂未实现)。 # 5.直接打开main.py文件,然后浏览器打开127.0.0.1 需要安装对应的Python库。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
实训项目-B站热门视频TOP20数据分析可视化系统源码(含实训报告+项目说明).zip (28个子文件)
fail.html 78KB
dm.js 30KB
dm_pb2.py 1KB
项目说明.md 681B
danmaku_wordCloud.html 31KB
demo.js 845B
reply_wordCloud.html 31KB
wordCloud.html 31KB
templates
Untitled-1.html 2KB
TOP20.html 23KB
Untitled-1.js 93KB
正态分布.html 13KB
echarts.js 734KB
index.html 34KB
message.js 2KB
main(执行该代码).py 17KB
data.db 20.99MB
message.json 0B
dm.json 3KB
(实训报告)B站弹幕可视化分析系统.pdf 1.21MB
__pycache__
operate_long_task.cpython-310.pyc 156B
dm_pb2.cpython-310.pyc 1KB
operate_database.cpython-310.pyc 155B
DataBase.cpython-310.pyc 1KB
dm.proto 363B
DataBase.py 908B
static
js
echarts.js 734KB
chart.js 73KB
共 28 条
- 1
资源评论
Make程序设计
- 粉丝: 5725
- 资源: 3570
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功