7、基于爬虫+Flask+Echarts+MySQL的网易云评论可视化大屏

embedded/2024/10/25 6:19:06/

基于爬虫+Flask+Echarts+MySQL的网易云评论可视化大屏

  • 1、前言
  • 2、实现
    • 2.1 挑选想要采集的歌曲评论
    • 2.2 构建爬虫
      • 2.2.1 采集歌曲评论
      • 2.2.2 清洗数据入库
    • 2.3 搭建flask框架
    • 2.4 数据传值
    • 2.5 完整代码&数据集获取

1、前言

本项目是基于requests爬虫+flask+echarts搭建的网易云评论的可视化大屏,主要涉及到的技术有爬虫、数据库操作,flask框架,echarts图表。

最终效果如下:
在这里插入图片描述

2、实现

2.1 挑选想要采集的歌曲评论

为了爬取歌曲评论,一想到的是网易云音乐,故从中挑选评论比较多的五首歌,分别是:

富士山下
爱情转移
孤独患者
葡萄成熟时
任我行

这五首歌,对应的网易云 id 是:

music_list = {65766: '富士山下', 65536: '爱情转移', 64093: '孤独患者', 66285: '葡萄成熟时', 27483202: '任我行'}

2.2 构建爬虫

2.2.1 采集歌曲评论

python">url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
data = {'params': encText,'encSecKey': encSecKey
}
respond = requests.post(url, headers=headers, data=data)
json_data = json.loads(respond.text)
comments = json_data['data']['comments']
for per_comment in comments:comment = per_comment['content']user_name = per_comment['user']['nickname']user_id = per_comment['user']['userId']comment_time = per_comment['time']timestamp = comment_time / 1000dt_object = datetime.datetime.fromtimestamp(timestamp)phone = per_comment.get('extInfo', {}).get('endpoint', {}).get('CLIENT_TYPE', '')ip = per_comment['ipLocation']['location']per_line = pd.DataFrame({'user_id': [user_id], 'comment': [comment], 'user_name': [user_name], 'time': [dt_object], 'ip': [ip],'phone': [phone], 'music_id': [music_id], 'music_name': [music_list[music_id]]})result = pd.concat([result, per_line])last_time = comment_time

2.2.2 清洗数据入库

python">def process_csv(file_path):# 读取 CSV 文件df = pd.read_csv(file_path)df = df.drop_duplicates()# 数据库连接connection = pymysql.connect(host='127.0.0.1',user='root',password='123456',database='music_comments')try:# 创建表(如果不存在)create_table_if_not_exists(connection)insert_query = """INSERT INTO comments (user_id, comment, user_name, time, ip, phone, music_id, music_name)VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"""with connection.cursor() as cursor:for _, row in df.iterrows():cursor.execute(insert_query, (row['user_id'] if pd.notna(row['user_id']) else None,row['comment'] if pd.notna(row['comment']) else None,row['user_name'] if pd.notna(row['user_name']) else None,row['time'] if pd.notna(row['time']) else None,row['ip'] if pd.notna(row['ip']) else None,row['phone'] if pd.notna(row['phone']) else None,row['music_id'] if pd.notna(row['music_id']) else None,row['music_name'] if pd.notna(row['music_name']) else None))connection.commit()print("数据写入成功")except Exception as e:print(f"错误: {e}")finally:connection.close()

最后数据库中数据效果如下:

在这里插入图片描述

flask_97">2.3 搭建flask框架

python">from flask import Flask,render_templateapp = Flask(__name__)
app.config['JSON_AS_ASCII'] = False@app.route('/')
def index():return render_template('index.html')if __name__ == '__main__':app.run(debug=True)

2.4 数据传值

python"># 左上图
data_music_name = ['富士山下', '爱情转移', '孤独患者', '葡萄成熟时', '任我行']
data_count = [216651, 142228, 109656, 102065, 26275]
list_1_data = []
for i in range(0, len(data_music_name)):music_name = data_music_name[i]count = data_count[i]list_1_data.append([music_name, count])
# 中上图
data2 = df['phone'].value_counts().reset_index()
data2 = data2[~data2['phone'].isnull()]
data_phone = data2['phone'].tolist()
data_count = data2['count'].tolist()
list_2_name = []
list_2_value = []
for i in range(0, len(data_phone)):list_2_name.append(data_phone[i])list_2_value.append(data_count[i])
# 右上图
text_df = df[~df['comment'].isnull()]
text = '。'.join(text_df['comment'].tolist())
words = jieba.cut(text)
word_counts = Counter(words)
filtered_counts = {word: count for word, count in word_counts.items()if len(word) > 1 and re.match(r'^[\u4e00-\u9fa5]+$', word)}
most_common_words = Counter(filtered_counts).most_common(10)
most_common_words4 = Counter(filtered_counts).most_common(100)
list_3_name = []
list_3_value = []
for per_word in most_common_words:list_3_name.append(per_word[0])list_3_value.append(per_word[1])
# 左下图
data4 = df['ip'].value_counts().reset_index()
data4 = data4[~data4['ip'].isnull()]
data_ip = data4['ip'].tolist()
data_count = data4['count'].tolist()
list_4_name = []
list_4_value = []
# 显示全部
# for i in range(0, len(data_ip)):
# 显示前十
for i in range(0, 10):list_4_name.append(data_ip[i])list_4_value.append(data_count[i])
# 词云
wordcloud_data = [{"name": word, "value": count} for word, count in most_common_words4]

2.5 完整代码&数据集获取

完整代码&数据集可以点击最上面链接下载或者扫描下方👇🏻👇🏻👇🏻二维码获取,还有更多可视化大屏等着你:

001 服务大数据可视化监管平台
002 水质情况实时监测预警系统
003 联心菜市场数据中心
004 政务大数据共享交换平台
005 可视化监控管理
006 全国疫情实时监控
007 惠民服务平台
008 兰州智慧消防大数据平台
......

http://www.ppmy.cn/embedded/132261.html

相关文章

Pandas 文件读取与保存指南:高效处理 CSV、Excel 等多种格式数据

Pandas 文件读取与保存指南:高效处理 CSV、Excel 等多种格式数据 本文详细介绍了如何使用 Pandas 的 IO 工具从各种常见文件格式(如 CSV、Excel、HTML、TXT 等)中读取和保存数据。通过 Pandas,用户可以轻松读取和修改数据&#x…

Java-线程池技术

一、线程池简介 线程池是一种池化的思想,是将一些共同资源放到池中进行管理和使用,从而避免大量的创建销毁带来的资源浪费等问题,线程池主要优点体现在: 降低资源消耗:普通线程创建执行完任务之后即被销毁&#xff0…

阿里云用STS上传oss的完整程序执行流程图 和前端需要哪些参数uniapp

H5 微信小程序可用的前端直传阿里云OSS(STS临时凭证前端签名)直接下载插件 下面是原理说明: 明白了,我来详细说明前端上传文件到阿里云OSS需要携带的具体参数: 从服务器获取的 STS 凭证: // 这些参数需要从你的后端服务器获…

从0开始学python-day14-pandas1

一、基础 1、概述 Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来 Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)…

10.22.2024刷华为OD C题型(三)--for循环例子

脚踝动了手术,现在宾馆恢复,伤筋动骨一百天还真不是说笑的,继续努力吧。 文章目录 靠谱的车灰度图恢复灰度图恢复 -- for循环使用例子 靠谱的车 https://www.nowcoder.com/discuss/564514429228834816 这个题目思路不难,就是要自…

k8s 部署 emqx

安装cert-manager 使用Helm安装 helm repo add jetstack https://charts.jetstack.io helm repo update helm upgrade --install cert-manager jetstack/cert-manager \--namespace cert-manager \--create-namespace \--set installCRDstrue如果通过helm命令安装失败&#x…

gitlab不同账号间·仓库转移

背景:公司业务调整,原先在海外仓库的代码转移回国内 诉求:完整的保留项目记录 操作: 步骤一: 定位到需要迁移的原项目地址 步骤二:创建新项目 步骤三:打开命令行,创建好文件路径为需要clo…

docker 镜像详解

Docker镜像是一种轻量级、可移植的软件打包格式,它包含了运行应用程序所需的一切,是构建和分发应用程序的基础。以下是对Docker镜像的详细解释: 一、镜像的定义 镜像本质上是一个只读文件,包含了文件系统、源码、库文件、依赖、…