基于 Python 的 Bilibili 评论分析与可视化

一、项目概述

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

  1. 数据爬取:使用 Bilibili 提供的 API 获取指定视频的评论数据。
  2. 数据清洗:对评论内容进行文本预处理,清除无关信息,并对 IP 地址进行地区解析。
  3. 数据分析:对评论内容、点赞数等信息进行统计分析,挖掘出有意义的趋势。
  4. 数据可视化:使用 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 和页码范围(342801),并通过循环逐页爬取评论。每一条评论数据包括用户名、评论内容、时间戳、点赞数和 IP 地址。

三、数据清洗

数据爬取完成后,我们对获取的评论数据进行清洗。主要的清洗任务包括:

  1. 去除无关内容:移除 URL、标点符号、特殊字符等。
  2. 分词与停用词过滤:使用 jieba 对中文评论进行分词,并过滤掉无意义的停用词。
  3. IP 地址地区解析:对 IP 地址中的地理位置进行解析,将其统一成省份、市区等格式。
  4. 时间格式转换:将评论时间戳转换为标准的时间格式,便于后续的时间序列分析。

数据清洗的核心代码如下:

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 地址(用于分析地理分布)。

数据格式如下所示:

TimestampCleaned_CommentLike CountIP 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. 构建大屏展示

最后,我们将这些图表整合到一个交互式的大屏页面中。通过 pyechartsPage 类,可以将多个图表组合到一个页面,生成一个动态大屏。

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.org
  • jieba 官方文档:https://github.com/fxsjy/jieba
  • pyecharts 官方文档:https://pyecharts.org

希望通过这篇博客,大家能对如何通过 Python 进行 Bilibili 评论数据分析和可视化有一个清晰的了解,也希望能启发大家在实际项目中应用这些技术。

源代码添加

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins的pipeline Script的 每个组件的详细讲解

在Jenkins的Pipeline脚本中&#xff0c;各个组件的配置和Groovy的一些常用函数起到了决定性的作用&#xff0c;帮助开发人员控制自动化流程的执行。以下是对Jenkins Pipeline的主要组件和Groovy常用函数的详细讲解&#xff1a; 1. Jenkins Pipeline主要组件 1.1 agent 功能&…

基于碎纸片的拼接复原算法及MATLAB实现

一、问题描述 破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上&#xff0c;拼接复原工作需由人工完成&#xff0c;准确率较高&#xff0c;但效率很低。特别是当碎片数量巨大&#xff0c;人工拼接很难在短时间内完成任务。随着计算…

如何禁用VMware虚拟网卡

安装VMWare虚拟机之后&#xff0c;会在本地创建两个虚拟网卡VMware Network Adapter VMnet1和VMware Network Adapter VMnet8&#xff0c;如果使用iNode客户端联网时会进行禁用多网卡检测&#xff0c;否则无法联网。因此&#xff0c;问题根源就在于虚拟网卡未禁用。 1、网络和…

ElasticSearch备考 -- Cross cluster replication(CCR)

一、题目 操作在cluster1&#xff08;local&#xff09;中操作索引task&#xff0c;复制到cluster2&#xff08;remote&#xff09;中 二、思考 CCR 我们可以对标MySQL 理解为为主从&#xff0c;后者备份。主节点负责写入数据&#xff0c;从/备节点负责同步时主节点的数据。 …

界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

基于Java的药店管理系统

药店管理系统 一&#xff1a;基本介绍开发环境管理员功能模块图系统功能部分数据库表设计 二&#xff1a;部分系统页面展示登录界面管理员管理进货信息界面管理员管理药品信息界面管理员管理员工界面管理员管理供应商信息界面管理员管理销售信息界面员工对信息进行管理员工对销…

策略模式、状态机详细解读

策略模式 (Strategy Pattern) 策略模式 (Strategy Pattern) 是一种行为型设计模式&#xff0c;旨在将一组算法封装成独立的类&#xff0c;使得它们可以相互替换。这种模式让算法的变化不会影响到使用算法的客户&#xff0c;减少了类之间的耦合。策略模式通常用于处理一类问题&…

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

信号保存和信号处理

目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block&#xff0c;pendding&#xff0c;handler三张表的操作 sigpromask ​编辑 sigpending 是否有sighandler函数呢&#xff1f; 案例 信号处理 操作系统是如何运行的&#xff1f; 硬件中断 …

基于HTTP编写ping操作

基于HTTP编写ping操作 前言 在上一集我们就完成了创建MockServer的任务&#xff0c;那么我们就可以正式开始进行网络的通讯&#xff0c;那么我们今天就来基于HTTP来做一个客户端ping服务端的请求&#xff0c;服务端返回pong的响应。 需求分析 基于HTTP&#xff0c;实现ping…

机器学习 贝叶斯公式

这是条件概率的计算公式 &#x1d443;(&#x1d434;|&#x1d435;)&#x1d443;(B|A)&#x1d443;(&#x1d434;)/&#x1d443;(&#x1d435;) 全概率公式 &#x1d443;(&#x1d435;)&#x1d443;(&#x1d435;|&#x1d434;)&#x1d443;(&#x1d434;)&am…

【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)

第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 重要信息 三轮征稿时间&#xff1a;2024年11月30日23:5…

【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出

目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…

Java 责任链模式 减少 if else 实战案例

一、场景介绍 假设有这么一个朝廷&#xff0c;它有 县-->府-->省-->朝廷&#xff0c;四级行政机构。 这四级行政机构的关系如下表&#xff1a; 1、县-->府-->省-->朝廷&#xff1a;有些地方有完整的四级行政机构。 2、县-->府-->朝廷&#xff1a;直…

vue项目使用eslint+prettier管理项目格式化

代码格式化、规范化说明 使用eslintprettier进行格式化&#xff0c;vscode中需要安装插件ESLint、Prettier - Code formatter&#xff0c;且格式化程序选择为后者&#xff08;vue文件、js文件要分别设置&#xff09; 对于eslint规则&#xff0c;在格式化时不会全部自动调整&…

易考八股文之Elasticsearch合集

1、为什么要使用 Elasticsearch? 系统中的数据&#xff0c; 随着业务的发展&#xff0c; 时间的推移&#xff0c; 将会非常多&#xff0c;而业务中往往采用模糊查询进行数据的 搜索&#xff0c;而模糊查询会导致查询引擎放弃索引&#xff0c; 导致系统查询数据时都是全表扫描&…

Python 使用链式赋值

n n_ max(round(n * gd), 1) if n > 1 else n # depth gainPython 使用链式赋值将同一个值同时赋给多个变量。这意味着 n 和 n_ 会同时接收相同的结果值。我们可以将这行代码逐步拆解&#xff0c;以便理解传值的顺序和方法&#xff1a; 逐步解析 先计算右侧表达式的值&a…

Leetcode 整数转罗马数字

这段代码的算法思想是基于罗马数字的减法规则&#xff0c;将整数转换为罗马数字的字符串表示。下面是详细的解释&#xff1a; 算法步骤&#xff1a; 定义数值和符号对应关系&#xff1a;代码中定义了两个数组&#xff1a;values 和 symbols。values 数组包含了罗马数字的数值&…

web——sqliabs靶场——第六关——报错注入和布尔盲注

这一关还是使用报错注入和布尔盲注 一. 判断是否有sql注入 二. 判断注入的类型 是双引号的注入类型。 3.报错注入的检测 可以使用sql报错注入 4.查看库名 5. 查看表名 6.查看字段名 7. 查具体字段的内容 结束 布尔盲注 结束