基于b站弹幕的数据分析 技术总结和分享

零、引言

       笔者近日与队友们合作完成了《基于b站弹幕的数据分析》这一数据分析与可视化项目,也借此机会学到了许多有用的技术,收获颇丰。本文将重点对这些技术进行总结,并与诸位分享,希望能一同在数据分析之路上成长。

一、数据获取

【实现工具】

       Python(编写爬虫代码)、Excel(存储及处理所获取的数据)

【实现步骤】

  • 数据寻找

        在此项目中,我们需要获取的数据是b站视频的弹幕信息(如下图红框圈起来的部分所示——弹幕在视频中出现的时间、弹幕内容、弹幕发送时间)。

       我们尝试对所在的这个网页进行爬虫获取以上信息。然而,得到如下图所示结果。

       这说明利用爬虫爬取该网页会被网页的验证码拦截,无法从中获取数据。

       我们尝试寻找别的可行网页:在原网址的“bilibili”前加“i”,跳转到如下网址,并进一步进到下图红框圈起来的网址。

      我们可以看到以上界面,从第9行开始,每行黑色字表示弹幕内容;而蓝色字的各个参数依次表示:(根据所在列数)

1、弹幕在视频中出现时间(秒)

2、弹幕类型(若小于7则为普通弹幕)

3、字号

4、文字颜色

5、发送时间戳(代表了日期及时间,可转换成2023/12/10 10:00这种格式)

7、弹幕池ID

8、发送人ID

9、数据库记录ID

      可知我们需要获取其中的第一列、第五列、及黑色字对应的数据。

  • 代码实现

——基于requests库实现的爬虫

1、导入所需要的库

import requests
import xml.etree.ElementTree as ET
import pandas as pd

2、获取弹幕

#获取弹幕
def get_bilibili_danmaku(cid):   
    url = f"https://comment.bilibili.com/{cid}.xml"    #f前缀代表格式化字符串,里面可以包含{cid}这种占位符,使其之后能被替换
    response = requests.get(url)
    
    if response.status_code == 200:
        return response.content
    else:
        print(f"Error accessing the API. Status Code: {response.status_code}")
    return None

 3、解析弹幕

#解析弹幕
def parse_danmaku(xml_content):
    root = ET.fromstring(xml_content)    #解析xml格式的字符串
    danmaku_list = []

    for d in root.iter('d'):    #遍历xml树中所有标签为'd'的元素
        danmaku_text = d.text   
        danmaku_attr = d.attrib #返回d的属性字典
        time_info = danmaku_attr.get('p', '').split(',')
        
        if len(time_info) > 0:
            video_time = int(float(time_info[0]))  # #弹幕在视频中的出现时间(秒),转为整数秒
            hours = video_time // 3600
            minutes = (video_time % 3600) // 60
            seconds = video_time % 60
            real_time = f"{hours}:{minutes}:{seconds}"  # 格式化时间,取整到小时、分钟、秒'''

            date = time_info[4]
            
            danmaku_list.append({
                '弹幕': danmaku_text,
                '视频中时间': video_time,
                '发送时间戳': date
            })
    return danmaku_list

4、将获取的弹幕存储到excel

#将获取的弹幕信息保存到excel中
def save_danmaku_to_excel(danmaku_list, filename):    
    df = pd.DataFrame(danmaku_list)
    df.to_excel(filename, index=False, engine='openpyxl')
    print(f"保存了 {len(danmaku_list)} 条弹幕到 {filename}")
  • 数据处理

       运行以上的代码,我们可以获取这样形式的excel文件:

       然而,我们希望能得到日期格式的发送时间,便于后续的直观分析。因此我们在excel里编写函数并调整数字格式,将“发送时间戳”转为所需要的形式,如下图所示: 

二、情感分析

       我们在python中调用snownlp这一情感分析的库,对每一个视频的弹幕进行情感分析,并计算出每个视频弹幕中积极、消极或中立情绪的占比,利用matplotlib的子库pyplot绘制出相应的饼图。

  • 代码实现

1、导入所需要的库

from snownlp import SnowNLP
import matplotlib.pyplot as plt    #导入画图的库(pyplot是子库)

2、读取弹幕数据

file = open('{xxx.csv}', encoding = 'utf-8')
text = []
for line in file.readlines():      #依次读入弹幕文件的每一行
    content = line.split(',')
    text.append(content[0])

 3、情感分析

emotions = {'positive':0,
            'negative':0,
            'neutral':0}


for item in text:
    s = SnowNLP(item)
    if s.sentiments > 0.6:
        emotions['positive'] += 1
    elif s.sentiments < 0.4:
        emotions['negative'] += 1
    else:
        emotions['neutral'] += 1

4、绘制饼图

plt.style.use('fivethirtyeight')

plt.pie(emotions.values(), labels = emotions.keys(), autopct = '%1.1f%%')

plt.tight_layout()

#设置字体,显示为中文(否则会出现乱码)
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']

plt.title("弹幕情感分析饼图")          #添加标题
plt.savefig("弹幕情感分析饼图.jpg")    #保存图片
plt.show()                           #运行时显示

       例如,我们对b站排行榜前十的视频获取了弹幕,并根据上述代码进行处理,便可以得到如下所示的情感分析饼图:

三、弹幕词云

      词云图可以较好地反映在众多词句中,各种词句出现的频率如何。在python中,我们调用wordcloud库来绘制词云。

  • 代码实现

1、导入所需的库

from wordcloud import WordCloud
import csv
import imageio.v2 as imageio

2、读取弹幕数据

file = open('{xxx.csv}','r',encoding = 'utf-8')
lst =[]

for line in file.readlines():  
    content = line.split(',')
    lst.append(content[0])

txt = str(lst)

3、生成词云图

img = imageio.imread('{xxx.jpg}')  #词云模板

#自定义词云图的参数
wc = WordCloud(width = 10000, height =10000, 
               background_color = 'white', 
               font_path = 'C:\Windows\Fonts\msyh',
               mask = img)         

wc.generate(txt)

wc.to_file('{xx.jpg}')              #存储词云图

       在生成词云图中,我们可以自定义其参数,如分辨率、图片背景、图片模板等。

    (有关参数的详细介绍可参考这篇文章:https://blog.csdn.net/weixin_47282404/article/details/119916124?spm=1001.2014.3001.5506

       例如,我们用下面左边的图为模板,生成了下面右边的弹幕词云图,其形状确为蜡笔小新的形状。

 四、问题发现

  • 不足之处

       首先,在对弹幕进行情感分析时,我们发现snownlp库可能存在对语义理解有误的情况,例如某个视频很多弹幕是有关“致敬”的,但由其分析出的积极情绪只占了约27%,明显是不符合常理的。

  • 改进方法

       对于弹幕的情感分析,我们日后会寻找更针对中文语言的情感分析库,从而更准确地界定词句的情感,提升结果可靠性。

五、心得体会

       非常有幸能通过此次项目接触到Python各种各样的库以及爬虫的知识,也对数据分析的主要技术和流程有了了解。

       在如今的数字时代,我们将积极学习新兴知识,并把所学应用到实际中去,为数字社会贡献自己的力量!

  • 28
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python爬虫获取B站弹幕数据分析可以分为以下几个步骤: 1. 获取B站视频的cid,可以通过视频页面的URL来获取,例如视频页面的URL为:https://www.bilibili.com/video/BV1QK4y1d7dK,则cid为BV1QK4y1d7dK。 2. 使用B站提供的弹幕API获取弹幕数据,可以使用requests库发送请求,然后解析返回的XML数据,获取弹幕文本内容和发送时间等信息。 3. 将弹幕数据保存到本地文件或数据库中,可以使用csv、json、sqlite等格式进行存储。 4. 数据分析和可视化,可以使用pandas、matplotlib、seaborn等库进行数据分析和可视化,例如统计弹幕数量和分布、分析弹幕关键词等。 下面是一份获取B站视频弹幕并进行数据分析的示例代码: ```python import requests from bs4 import BeautifulSoup import xml.etree.ElementTree as ET import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 获取视频cid url = 'https://www.bilibili.com/video/BV1QK4y1d7dK' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') cid = soup.find('meta', {'itemprop': 'videoId'})['content'] # 获取弹幕数据 danmu_url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={cid}' response = requests.get(danmu_url) xml_data = response.content.decode('utf-8-sig') xml_root = ET.fromstring(xml_data) danmu_list = [] for danmu in xml_root.iter('d'): danmu_attr = danmu.attrib['p'].split(',') danmu_list.append({ 'time': float(danmu_attr[0]), 'mode': int(danmu_attr[1]), 'color': int(danmu_attr[3]), 'text': danmu.text.strip() }) # 保存弹幕数据到csv文件中 df = pd.DataFrame(danmu_list) df.to_csv('danmu.csv', index=False, encoding='utf-8-sig') # 数据分析和可视化 df['datetime'] = pd.to_datetime(df['time'], unit='s') df['date'] = df['datetime'].dt.date df['hour'] = df['datetime'].dt.hour df['minute'] = df['datetime'].dt.minute df['second'] = df['datetime'].dt.second df['count'] = 1 # 统计弹幕数量和分布 danmu_count = df.groupby('date')['count'].sum() danmu_count.plot(kind='line', title='B站弹幕数量趋势', figsize=(8, 4)) plt.show() danmu_hour_count = df.groupby('hour')['count'].sum() danmu_hour_count.plot(kind='bar', title='B站弹幕小时分布', figsize=(8, 4)) plt.show() # 分析弹幕关键词 from jieba.analyse import extract_tags keywords = extract_tags(df['text'].str.cat(sep=' '), topK=20, withWeight=True) df_keywords = pd.DataFrame(keywords, columns=['keyword', 'weight']) sns.barplot(x='weight', y='keyword', data=df_keywords) plt.title('B站弹幕关键词分析') plt.show() ``` 以上代码可以获取B站视频的弹幕数据,并对弹幕数据进行数量和分布统计、关键词分析等操作,并使用pandas、matplotlib和seaborn等库进行数据分析和可视化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值