基于 Python 的 Bilibili 评论分析与可视化
一、项目概述
本项目利用 Python 对 Bilibili (哔哩哔哩)平台上的视频评论数据进行爬取、清洗和分析,并通过可视化展示数据的主要特征。我们通过以下几个步骤实现了这一过程:
- 数据爬取:使用 Bilibili 提供的 API 获取指定视频的评论数据。
- 数据清洗:对评论内容进行文本预处理,清除无关信息,并对 IP 地址进行地区解析。
- 数据分析:对评论内容、点赞数等信息进行统计分析,挖掘出有意义的趋势。
- 数据可视化:使用
pyecharts
库生成词云图、柱状图、折线图等多种图表,展示评论的分布与趋势。
本文将详细介绍每一步的实现过程,以及如何利用 Python 工具处理和分析海量的网络评论数据。
二、数据爬取
首先,我们使用 Bilibili 提供的 API 接口来获取视频的评论数据。Bilibili 的 API 支持根据视频 ID(oid)、页码(pn)等参数获取评论信息。我们通过构造请求 URL 发送 HTTP 请求来抓取数据。
以下是爬虫代码的核心部分:
import requests
import csv
import time
import random
from tqdm import tqdm# 设置请求头
header = {"Cookie": "你的 Cookie 值","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}# 视频 ID 列表
list_id = [898762590]# 数据爬取过程
for i in tqdm(list_id):rows = []for p in tqdm(range(342, 801)):try:html = requests.get(url, headers=header)data = html.json()# 提取评论数据for reply in data['data']['replies']:username = reply['member']['uname']comment = reply['content']['message']ctime = trans_date(reply['ctime'])# 保存数据到 CSVwith open(f'bilibili_comments_{i}.csv', 'a', newline='', encoding='utf-8') as file:writer = csv.writer(file)if file.tell() == 0:writer.writerow(['Username', 'Comment', 'Timestamp', 'Like Count', 'IP Location'])writer.writerows(rows)
在此代码中,我们指定了视频的 ID 和页码范围(342
到 801
),并通过循环逐页爬取评论。每一条评论数据包括用户名、评论内容、时间戳、点赞数和 IP 地址。
三、数据清洗
数据爬取完成后,我们对获取的评论数据进行清洗。主要的清洗任务包括:
- 去除无关内容:移除 URL、标点符号、特殊字符等。
- 分词与停用词过滤:使用
jieba
对中文评论进行分词,并过滤掉无意义的停用词。 - IP 地址地区解析:对 IP 地址中的地理位置进行解析,将其统一成省份、市区等格式。
- 时间格式转换:将评论时间戳转换为标准的时间格式,便于后续的时间序列分析。
数据清洗的核心代码如下:
import re
import jieba
from zhon.hanzi import punctuation as zh_punctuationdef clean_text(text):# 去除 URL 和特殊字符text = re.sub(r'http\S+', '', text)text = re.sub(f"[{zh_punctuation}]", "", text) # 去除中文标点text = re.sub(r'[.,!?]', '', text) # 去除英文标点text = re.sub(r'[^a-zA-Z0-9\u4e00-\u9fa5\s]', '', text) # 保留字母、数字和中文text = ' '.join(text.split()) # 去除多余的空格return text# 停用词处理
def load_stopwords(filepath):with open(filepath, 'r', encoding='gbk') as f:stopwords = f.read().splitlines()return stopwords# 文本预处理
def preprocess_text(text, stopwords):words = jieba.cut(text)return [word for word in words if word not in stopwords and len(word) > 1]df['Comment'] = df['Comment'].apply(clean_text)
stopwords = load_stopwords('./stop_word.txt')
df['Cleaned_Comment'] = df['Comment'].apply(lambda x: preprocess_text(x, stopwords))
四、数据分析与可视化
1. 准备工作
在开始之前,确保你已经安装了所需的 Python 库,并且有一个包含 Bilibili 评论数据的 CSV 文件。我们将使用以下库:
pandas
:用于数据处理和分析。pyecharts
:用于生成图表和大屏展示。
首先安装这些库:
pip install pandas pyecharts
2. 数据准备
假设我们已经获取到 Bilibili 的评论数据,并将其保存为 data2.csv
。数据的主要字段包括:
Timestamp
:评论的时间戳。Cleaned_Comment
:清洗后的评论内容,存储为 Python 列表格式。Like Count
:评论的点赞数。IP Location
:评论者的 IP 地址(用于分析地理分布)。
数据格式如下所示:
Timestamp | Cleaned_Comment | Like Count | IP Location |
---|---|---|---|
2022-01-01 12:00:00 | [‘word1’, ‘word2’, ‘word3’] | 5 | 北京市 |
2022-01-01 12:05:00 | [‘word4’, ‘word5’, ‘word2’] | 10 | 上海市 |
… | … | … | … |
3. 数据处理与分析
3.1 处理评论文本与词频分析
为了从评论中提取出有用的信息,我们将清洗后的评论文本展开,并统计每个词语的出现频率,以便生成词云和柱状图。
import pandas as pd
from collections import Counter# 读取 CSV 文件
df = pd.read_csv('data2.csv')# 将 Cleaned_Comment 列转换为 Python 列表
df['Cleaned_Comment'] = df['Cleaned_Comment'].apply(eval)# 展平所有评论词语
all_words = [word for comment in df['Cleaned_Comment'] for word in comment]# 统计词频
word_counts = Counter(all_words)# 转换为词云输入格式
wordcloud_data = [(word, count) for word, count in word_counts.items()]
3.2 时间处理与按时间间隔统计
我们将时间戳转换为 datetime
格式,并按天或按15天的时间间隔统计评论数量和点赞数的变化。
# 转换时间戳为 datetime 格式
df['Timestamp'] = pd.to_datetime(df['Timestamp'])# 筛选出2022年数据
df_2022 = df[(df['Timestamp'] >= '2022-01-01') & (df['Timestamp'] < '2023-01-01')]# 按15天的时间间隔统计评论数量
comment_count_by_15days = df_2022.resample('15D', on='Timestamp').size().reset_index(name='Comment Count')
x_data_comment = comment_count_by_15days['Timestamp'].dt.strftime('%Y-%m-%d').tolist()
y_data_comment = comment_count_by_15days['Comment Count'].tolist()# 按15天的时间间隔统计点赞数量
like_count_by_15days = df_2022.resample('15D', on='Timestamp').sum().reset_index()
x_data_like = like_count_by_15days['Timestamp'].dt.strftime('%Y-%m-%d').tolist()
y_data_like = like_count_by_15days['Like Count'].tolist()
3.3 统计 IP 地理分布
我们还可以统计评论的 IP 地址分布,了解用户的地理位置。
# 统计各省份的 IP 地址数量
province_ip_count = df['IP Location'].value_counts().reset_index()
province_ip_count.columns = ['province', 'ip_count']
4. 使用 pyecharts 创建图表
接下来,我们将使用 pyecharts
库来生成各种类型的图表,包括词云图、柱状图、折线图和地图。
4.1 生成词云图
词云图展示了评论中最常出现的词语,直观地呈现了评论内容的主要话题。
from pyecharts.charts import WordCloud
from pyecharts import options as optswordcloud = WordCloud(init_opts=opts.InitOpts(width="800px", height="600px"))
wordcloud.add("", wordcloud_data, word_size_range=[20, 100])
wordcloud.set_global_opts(title_opts=opts.TitleOpts(title="评论词云图"))
wordcloud.render("wordcloud.html")
4.2 生成评论和点赞量变化折线图
折线图可以帮助我们观察评论和点赞数量的时间变化趋势。
from pyecharts.charts import Lineline_comment = (Line().add_xaxis(x_data_comment).add_yaxis("2022年评论量每15天变化", y_data_comment).set_global_opts(title_opts=opts.TitleOpts(title="2022年评论量变化"))
)line_like = (Line().add_xaxis(x_data_like).add_yaxis("2022年点赞量每15天变化", y_data_like).set_global_opts(title_opts=opts.TitleOpts(title="2022年点赞量变化"))
)line_comment.render("comment_change.html")
line_like.render("like_change.html")
4.3 生成地理分布地图
我们使用地图展示 IP 地址的地理分布,了解用户的分布情况。
from pyecharts.charts import Mapmap_chart = (Map().add("IP 数量", [list(z) for z in zip(province_ip_count['province'], province_ip_count['ip_count'])], "china").set_global_opts(title_opts=opts.TitleOpts(title="IP 地址分布"))
)
map_chart.render("ip_location_map.html")
4.4 创建时间轮播图
时间轮播图可以展示不同年份和月份的评论和点赞数据。通过设置 pyecharts
中的 Timeline
,可以制作动态展示的效果。
from pyecharts.charts import Timeline, Bartimeline = Timeline()for year in df['Year'].unique():df_year = df[df['Year'] == year]bar = (Bar().add_xaxis(df_year['Month'].astype(str).tolist()).add_yaxis("每月评论数", df_year['Comment Count'].tolist()).set_global_opts(title_opts=opts.TitleOpts(title=f"{year}年每月评论数")))timeline.add(bar, f"{year}年")timeline.render("timeline.html")
5. 构建大屏展示
最后,我们将这些图表整合到一个交互式的大屏页面中。通过 pyecharts
的 Page
类,可以将多个图表组合到一个页面,生成一个动态大屏。
from pyecharts.components import Table
from pyecharts.charts import Page# 创建表格
table = Table()
headers = ["基于 Python 的 Bilibili 评论分析大屏"]
rows = []
table.add(headers=headers, rows=rows)# 创建页面
page = Page(layout=Page.DraggablePageLayout)page.add(table,wordcloud,line_comment,line_like,map_chart,timeline
)# 渲染大屏页面
page.render("bilibili_comment_analysis.html")
print("大屏生成完毕:bilibili_comment_analysis.html")
6. 结果展示
执行完上述代码后,你将得到一个包含以下内容的交互式大屏:
- 评论词云图:展示评论中最常见的词汇。
- 时间折线图:展示评论和点赞数的时间变化。
- 地理分布图:展示评论者的地理位置分布。
- 时间轮播图:展示不同年份和月份的评论和点赞数据。
五、总结
本项目展示了如何利用 Python 从 Bilibili 获取评论数据,经过清洗和处理后,通过多种图表形式展示数据分析结果。通过对评论内容和点赞数的分析,我们可以揭示视频的互动情况,了解用户的情感倾向与话题趋势。数据可视化部分使得这些分析结果更加直观、易懂。
对于未来的改进,我们可以进一步优化爬虫性能,增加对评论的情感分析,或者将数据存储到数据库中进行更加复杂的查询与分析。
六、参考资料
- Bilibili API文档: Bilibili Open API
pandas
官方文档:https://pandas.pydata.orgjieba
官方文档:https://github.com/fxsjy/jiebapyecharts
官方文档:https://pyecharts.org
希望通过这篇博客,大家能对如何通过 Python 进行 Bilibili 评论数据分析和可视化有一个清晰的了解,也希望能启发大家在实际项目中应用这些技术。
源代码添加
相关文章:

基于 Python 的 Bilibili 评论分析与可视化
一、项目概述 本项目利用 Python 对 Bilibili (哔哩哔哩)平台上的视频评论数据进行爬取、清洗和分析,并通过可视化展示数据的主要特征。我们通过以下几个步骤实现了这一过程: 数据爬取:使用 Bilibili 提供的 API 获取…...

大语言模型理论基础
文章目录 前言大语言模型必需知识概述大语言模型目标模型上下文神经网络的神经元常见激活函数SigmoidTanhRelusoftmax 通用近似定理多层感知机(MLP)拟合最后 前言 你好,我是醉墨居士,我们接下来对大语言模型一探究竟,…...

【 LLM论文日更|检索增强:大型语言模型是强大的零样本检索器 】
论文:https://aclanthology.org/2024.findings-acl.943.pdf代码:GitHub - taoshen58/LameR机构:悉尼科技大学 & 微软 & 阿姆斯特丹大学 & 马里兰大学领域:retrieval & llm发表:ACL2024 研究背景 研究…...

【基于轻量型架构的WEB开发】课程 作业3 Spring框架
一. 单选题(共12题,48分) 1. (单选题)以下有关Spring框架优点的说法不正确的是( )。 A. Spring就大大降低了组件之间的耦合性。 B. Spring是一种侵入式框架 C. 在Spring中,可以直接通过Spring配置文件管理…...

14.最长公共前缀-力扣(LeetCode)
题目: 解题思路: 解决本题的关键点是确定扫描的方式,大体上有两种方式:横向扫描和纵向扫描。 1、横向扫描:首先比较第一个字符串和第二个字符串,记录二者的公共前缀,然后用当前公共前缀与下一个…...

客户案例|智能进化:通过大模型重塑企业智能客服体验
01 概 述 随着人工智能技术的快速发展,客户对服务体验的期待和需求不断升级。在此背景下,大模型技术的崛起,为智能客服领域带来了创造性的变革。 在上篇文章《在后LLM时代,关于新一代智能体的思考》中有提到,智能客服…...

Flink Job更新和恢复
Checkpoints 的主要目的是为意外失败的作业提供恢复机制。 Savepoints的设计更侧重于可移植性和操作灵活性,尤其是在 job 变更方面。Savepoint 的用例是针对计划中的、手动的运维。例如,可能是更新你的 Flink 版本,更改你的作业图等等。 fli…...

读多写少业务中,MySQL如何优化数据查询方案?
小熊学Java站点:https://www.javaxiaobear.cn 编程资料合集:https://pqgmzk7qbdv.feishu.cn/base/QXq2bY5OQaZiDksJfZMc30w5nNb?from=from_copylink 看一看当面试官提及“在读多写少的网络环境下,MySQL 如何优化数据查询方案”时,你要从哪些角度出发回答问题??? 案例…...

Bugku CTF_Web——点login咋没反应
Bugku CTF_Web——点login咋没反应 进入靶场 随便输个试试 看来确实点login没反应 抓包看看 也没有什么信息 看了下源码 给了点提示 一个admin.css try ?12713传参试试 拿到一个php代码 <?php error_reporting(0); $KEYctf.bugku.com; include_once("flag.php&q…...

attention 注意力机制 学习笔记-GPT2
注意力机制 这可能是比较核心的地方了。 gpt2 是一个decoder-only模型,也就是仅仅使用decoder层而没有encoder层。 decoder层中使用了masked-attention 来进行注意力计算。在看代码之前,先了解attention-forward的相关背景知识。 在普通的self-atten…...

什么是HTTP,什么是HTTPS?HTTP和HTTPS都有哪些区别?
什么是 HTTP? HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种应用层协议,用于在互联网上进行数据通信。它定义了客户端(通常是浏览器)和服务器之间的请求和响应格式。HTTP 是无状态的…...

SkyWalking-安装
SkyWalking-简单介绍 是一个开源的分布式追踪系统,用于检测、诊断和优化分布式系统的功能。 支持 ElasticSearch、H2、MySQL、PostgreSql 等数据库 基于 ElasticSearch 的情况 ElasticSearch(ES) 安装 1、下载并解压 https://www.elastic…...

RabbitMQ运维
1. 单机多节点 1.1 搭建RabbitMQ ①安装RabbitMQ 略 ②确认RabbitMQ运⾏没问题 #查看RabbitMQ状态 rabbitmqctl status 节点名称: 端口号: 25672:Erlang分布式节点通信的默认端⼝, Erlang是RabbitMQ的底层通信协议.15672: Web管理界⾯的默认端⼝, 通过这个端⼝可以访问R…...

Go语言并发精髓:深入理解和运用go语句
Go语言并发精髓:深入理解和运用go语句 在Go语言的世界里,go语句是实现并发的核心,它简洁而强大,允许程序以前所未有的方式运行多个任务。本文将深入探讨go语句及其执行规则,揭示Go语言并发编程的内在机制,并提供实际案例帮助读者掌握其用法。 1. go语句的基本概念(Wha…...

基于STM32的智能家居系统:MQTT、AT指令、TCP\HTTP、IIC技术
一、项目概述 随着智能家居技术的不断发展,越来越多的家庭开始使用智能设备来提升生活质量和居住安全性。智能家居系统不仅提供了便利的生活方式,还能有效地监测家庭环境,保障家庭安全。本项目以设计一种基于STM32单片机的智能家居系统为目标…...

分糖果(相等分配)
题目:有n种不同口味的糖果,第i种糖果的数量为a[i],现在需要把糖果分给m个人。分给每个人糖果的数量必须是相等的,并且每个人只能选择一种糖果。也就是说,可以把一种糖果分给多个人,但是一个人的糖果不能有多…...

docker构建jdk11
# 建立一个新的镜像文件,配置模板:新建立的镜像是以centos为基础模板 # 因为jdk必须运行在操作系统之上 FROM centos:7.9.2009# 作者名 MAINTAINER yuanhang# 创建一个新目录来存储jdk文件 RUN mkdir /usr/local/java#将jdk压缩文件复制到镜像中&#…...

唐帕科技校园语音报警系统:通过关键词识别,阻止校园霸凌事件
校园霸凌问题已成为全球教育领域的严峻挑战,给受害者带来了身心上的长期创伤。然而,随着科技的发展,尤其是人工智能和语音识别技术的不断进步,我们开始看到创新性解决方案的出现。校园语音报警系统便是其中一种利用技术手段保护学…...

酒店行业数据仓库
重要名词: PMS:酒店管理系统CRS:中央预定系统客户:可以分为会员、散客(自行到店入住)、协议(与酒店长期合作,内部价)、中介预定:可以分为线上预定、线下预定…...

A029-基于Spring Boot的物流管理系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...

Python Day5 进阶语法(列表表达式/三元/断言/with-as/异常捕获/字符串方法/lambda函数
Python 列表推导式是什么 列表推导式是 Python 语言特有的一种语法结构,也可以看成是 Python 中一种独特的数据处理方式, 它在 Python 中用于 转换 和 过滤 数据。 其语法格式如下所示,其中 [if 条件表达式] 可省略。 [表达式 for 迭代变量…...

一文了解Android的核心系统服务
在 Android 系统中,核心系统服务(Core System Services)是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持,包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…...

Scala的Array(1)
Scala的Array表示长度不可变的数组,若需要定义可变数组需要倒包 import scala.collection.mutable.ArrayBuffer 下面是关于Array的一些用法: import scala.collection.mutable.ArrayBufferobject test29 { // //不可变数组 Array // def main(args:…...

[Linux] Linux信号捕捉
在Linux中,信号捕捉是通过使用信号处理函数来实现的。信号是操作系统用于通知进程发生某些事件的机制,例如终止进程、外部中断、非法操作等。常用的信号捕捉机制是通过signal()函数或sigaction()函数来注册信号处理程序。 1. 使用signal()函数 signal(…...

Elasticsearch的查询语法——DSL 查询
控制台打印日志: index-name: local_es_staff_info202404021352 DSL:{“size”:10000,“query”:{“bool”:{“must”:[{“terms”:{“emplId”:[“001756”,“000043”,“004193”],“boost”:1.0}}],“adjust_pure_negative”:true,“boost”:1.0}},“…...

开发语言中,堆区和栈区的区别
非javascript 1. 存储方式 栈区:栈区(Stack)是由系统自动分配的内存区域,通常用于存储函数的局部变量、参数、返回地址等。栈区的内存按照先进后出的顺序进行管理。堆区:堆区(Heap)是由程序员…...

驾校增加无人机培训项目可行性技术分析
驾校增加无人机培训项目的可行性技术分析,需要从市场需求、技术基础、政策支持、培训体系构建及运营等多个维度进行综合考量。以下是对这些方面的详细分析: 一、市场需求分析 1. 行业应用广泛:无人机在航拍、农业、环境监测、地理测绘、电力…...

JavaWeb后端开发知识储备1
目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象,是用于传输数据的对象,通常在服务层与表现层之间传递数据,DTO 通常用于…...

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
在当今快速发展的农业领域,智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快,智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…...

大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...