Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python爬虫抓取Bilibili弹幕并生成词云

Python爬虫抓取Bilibili弹幕并生成词云

作者头像
小白学大数据
发布于 2025-05-10 00:15:05
发布于 2025-05-10 00:15:05
18700
代码可运行
举报
文章被收录于专栏:python进阶学习python进阶学习
运行总次数:0
代码可运行

1. 引言

Bilibili(B站)是国内知名的视频分享平台,拥有海量的弹幕数据。弹幕是B站的核心特色之一,用户通过弹幕进行实时互动,这些数据对于分析视频热度、用户情感倾向等具有重要价值。

本文将介绍如何利用Python爬虫技术抓取Bilibili视频的弹幕数据,并使用WordCloud库生成词云,直观展示弹幕中的高频词汇。

2. 技术栈

  • Python:主编程语言
  • Requests:HTTP请求库,用于获取网页数据
  • BeautifulSoup / lxml:HTML/XML解析库
  • re(正则表达式):提取弹幕数据
  • WordCloud / jieba:生成词云并进行中文分词
  • Matplotlib / PIL:可视化展示

3. 分析B站弹幕数据来源

B站的弹幕数据通常存储在XML文件中,每个视频对应一个弹幕文件(**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**决定)。我们需要:

  1. 获取视频的**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**(弹幕ID)
  2. 请求弹幕API(如 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://comment.bilibili.com/{cid}.xml</font>**
  3. 解析XML数据,提取弹幕文本
3.1 获取视频的**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**

B站的视频页面(如 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://www.bilibili.com/video/BV1xxxxxx</font>**)中,**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**通常可以通过以下方式获取:

  • 解析网页源码,查找 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">window.__playinfo__</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>** 相关字段
  • 调用B站API(如 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://api.bilibili.com/x/web-interface/view?bvid=BV1xxxxxx</font>**

本文采用 API方式 获取 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**,更加稳定。

4. 代码实现

4.1 安装依赖
4.2 获取视频**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests

def get_cid(bvid):
    """通过B站API获取视频的cid"""
    url = f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        data = response.json()
        return data["data"]["cid"]
    else:
        raise Exception("Failed to fetch cid")

# 示例:获取视频 BV1GJ411x7h7 的 cid
bvid = "BV1GJ411x7h7"  # 替换为目标视频的BV号
cid = get_cid(bvid)
print(f"视频的cid: {cid}")
4.3 抓取弹幕数据

B站的弹幕文件通常存储在 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://comment.bilibili.com/{cid}.xml</font>**,我们需要解析XML并提取弹幕文本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from bs4 import BeautifulSoup

def fetch_danmaku(cid):
    """获取弹幕XML并解析"""
    url = f"https://comment.bilibili.com/{cid}.xml"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        soup = BeautifulSoup(response.content, "lxml")
        danmaku_list = [d.text for d in soup.find_all("d")]
        return danmaku_list
    else:
        raise Exception("Failed to fetch danmaku")

# 获取弹幕
danmaku_list = fetch_danmaku(cid)
print(f"共获取 {len(danmaku_list)} 条弹幕")
4.4 数据清洗(可选)

弹幕可能包含无意义的符号、表情等,可以使用正则表达式过滤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re

def clean_text(text):
    """清洗弹幕文本"""
    # 去除特殊符号、空格、换行等
    text = re.sub(r'[^\w\s]', '', text)  # 去除非字母数字汉字
    text = re.sub(r'\s+', ' ', text)     # 合并多个空格
    return text.strip()

cleaned_danmaku = [clean_text(d) for d in danmaku_list]
4.5 生成词云

使用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">jieba</font>** 进行中文分词,并用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">WordCloud</font>** 生成词云:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

def generate_wordcloud(text_list, output_path="wordcloud.png"):
    """生成词云"""
    # 合并所有弹幕
    text = " ".join(text_list)
    
    # 使用 jieba 分词
    words = " ".join(jieba.cut(text))
    
    # 设置词云参数
    wc = WordCloud(
        font_path="msyh.ttc",  # 支持中文的字体(Windows可用)
        width=800,
        height=600,
        background_color="white",
        max_words=200,
        collocations=False,  # 避免重复词
    )
    
    # 生成词云
    wc.generate(words)
    
    # 保存词云图片
    wc.to_file(output_path)
    print(f"词云已生成: {output_path}")
    
    # 显示词云
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    plt.show()

# 生成词云
generate_wordcloud(cleaned_danmaku)
4.6 完整代码整合
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
from bs4 import BeautifulSoup
import re
from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt

# 代理配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 代理格式整理
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
proxies = {
    "http": proxyMeta,
    "https": proxyMeta,
}

def get_cid(bvid):
    """获取视频cid"""
    url = f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}"
    headers = {"User-Agent": "Mozilla/5.0"}
    try:
        # 添加 proxies 参数
        response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        if response.status_code == 200:
            return response.json()["data"]["cid"]
        else:
            raise Exception(f"API请求失败,状态码:{response.status_code}")
    except Exception as e:
        raise Exception(f"获取cid时出错:{str(e)}")

def fetch_danmaku(cid):
    """获取弹幕XML并解析"""
    url = f"https://comment.bilibili.com/{cid}.xml"
    headers = {"User-Agent": "Mozilla/5.0"}
    try:
        # 添加 proxies 参数
        response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        if response.status_code == 200:
            soup = BeautifulSoup(response.content, "lxml")
            return [d.text for d in soup.find_all("d")]
        else:
            raise Exception(f"弹幕请求失败,状态码:{response.status_code}")
    except Exception as e:
        raise Exception(f"获取弹幕时出错:{str(e)}")

def clean_text(text):
    """清洗弹幕文本"""
    text = re.sub(r'[^\w\s]', '', text)
    text = re.sub(r'\s+', ' ', text)
    return text.strip()

def generate_wordcloud(text_list, output_path="wordcloud.png"):
    """生成词云"""
    text = " ".join(text_list)
    words = " ".join(jieba.cut(text))
    
    wc = WordCloud(
        font_path="msyh.ttc",
        width=800,
        height=600,
        background_color="white",
        max_words=200,
        collocations=False,
    )
    wc.generate(words)
    wc.to_file(output_path)
    
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    plt.show()

if __name__ == "__main__":
    try:
        bvid = "BV1GJ411x7h7"  # 替换为目标视频BV号
        cid = get_cid(bvid)
        print(f"成功获取视频CID: {cid}")
        danmaku_list = fetch_danmaku(cid)
        print(f"共获取 {len(danmaku_list)} 条弹幕")
        cleaned_danmaku = [clean_text(d) for d in danmaku_list]
        generate_wordcloud(cleaned_danmaku)
    except Exception as e:
        print(f"程序运行出错: {str(e)}")

5. 优化与扩展

  1. 反爬策略:B站可能有反爬机制,可以设置 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">headers</font>** 模拟浏览器访问,或使用代理IP。
  2. 多视频弹幕抓取:遍历多个视频的 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**,批量获取弹幕数据。
  3. 情感分析:结合 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">SnowNLP</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">TextBlob</font>** 分析弹幕情感倾向。
  4. 动态词云:使用 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Pyecharts</font>** 生成交互式词云。

6. 结论

本文介绍了如何用Python爬取B站弹幕并生成词云,涉及:

  • B站API调用(获取**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cid</font>**
  • XML弹幕解析**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">BeautifulSoup</font>**
  • 中文分词**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">jieba</font>**
  • 词云可视化**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">WordCloud</font>**

该方法适用于视频分析、用户行为研究、热点话题挖掘等场景。读者可以进一步扩展,如结合机器学习进行弹幕分类或情感分析。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手带你B站少量弹幕爬取并生成词云
其中requests和bs4以及re是爬虫的主力军,而numpy、Image、jieba、wordcloud就是生成词云要用到的东西。pandas是便于格式化来输出文件是。
Regan Yue
2021/12/01
1.6K0
用Python爬取王冰冰vlog弹幕并制作词云
各种评论视频“爆炸”网络,打开首页全是热点话题的内容,某知名UP主发布视频都要错下峰。
朱小五
2021/02/05
3920
Python实现跳词云舞
新建一个人像分割的实例,新注册用户可免费领取资源,官网地址:https://cloud.baidu.com/product/body/seg。下面是小编申请的一个实例:
皮大大
2023/08/25
2920
《请回答1988》弹幕分析
首先,通过b站网址,查看到《请回答1988》木鱼水心弹幕最多的一集,其URL如下:
技术路漫漫
2020/06/15
9890
《请回答1988》弹幕分析
爬取许嵩新歌《雨幕》弹幕,告诉你什么才是真正的创作!
首先,利用哔哩哔哩的弹幕接口,把数据保存到本地。接着,对数据进行分词。最后,做了评论的可视化。
小小詹同学
2019/10/21
8931
爬取许嵩新歌《雨幕》弹幕,告诉你什么才是真正的创作!
Python爬虫,最新的B站弹幕和评论爬虫,你们要的冰冰来啦!
最近想爬下B站的弹幕和评论,发现网上找到的教程基本都失效了,毕竟爬虫和反爬是属于魔高一尺、道高一丈的双方,程序员小哥哥们在网络的两端斗智斗勇,也是精彩纷呈。
周萝卜
2022/12/27
7340
Python爬虫,最新的B站弹幕和评论爬虫,你们要的冰冰来啦!
爬取bilibili的弹幕制作词云
爬取哔哩哔哩的弹幕,http://comment.bilibili.com/6315651.xml
andrew_a
2019/07/30
9860
爬取bilibili的弹幕制作词云
最新的B站弹幕和评论爬虫,你们要的冰冰来啦!
最近想爬下B站的弹幕和评论,发现网上找到的教程基本都失效了,毕竟爬虫和反爬是属于魔高一尺、道高一丈的双方,程序员小哥哥们在网络的两端斗智斗勇,也是精彩纷呈。
周萝卜
2021/10/13
8730
你认可《后浪》吗
前几天 B 站上线了一个小视频《后浪》,在全网引起了热烈反响,有赞扬也有批评,视频地址:https://www.bilibili.com/video/BV1FV411d7u7,本文我们爬一下视频弹幕来了解一下 B 站网友对视频的看法。
Python小二
2020/08/18
3660
你认可《后浪》吗
Python数据可视化:啥是佩奇
网址:http://comment.bilibili.com/72036817.xml
数据森麟
2019/09/29
3850
Python数据可视化:啥是佩奇
【Python爬虫】15行代码教你爬B站视频弹幕,词云图展示数据(附源码)
知识点 爬虫基本流程 正则 requests >>> pip install requests jieba >>> pip install jieba imageio >>> pip install imageio wordcloud >>> pip install wordcloud 开发环境 add path 勾选 其他可以默认安装 Python越新的版本 代表的一些模块不太兼容 Python 3.6 / 3.8 >>> python解释器(环境) Pycharm >>> python编辑器 代码实现过
松鼠爱吃饼干
2021/10/14
1.3K0
写了个爬虫,收集了b站所有的弹幕
这两天王力宏的瓜可谓是闹的沸沸扬扬,不怎么吃瓜的我也听了不少传闻。网上观点主要分为两派,一种无脑直接喷的,一种是说人品和艺术无关的。而我也想看看大家对他都什么看法,因此写了个爬虫爬了一下b站视频的弹幕。
godweiyang
2021/12/21
1.5K0
写了个爬虫,收集了b站所有的弹幕
用Python围观垃圾分类是什么回事
目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 纸巾再湿也是干垃圾?瓜子皮再干也是湿垃圾??最近大家都被垃圾分类折磨的不行,傻傻的你是否拎得清????自2019.07.01开
龙哥
2019/07/10
1K1
用Python围观垃圾分类是什么回事
Python爬虫 爬取B站视频弹幕 + 绘制词云
视频链接:https://www.bilibili.com/video/BV1zE411Y7JY
叶庭云
2020/09/17
3.5K0
Python爬虫    爬取B站视频弹幕 + 绘制词云
python爬取B站视频弹幕分析并制作词云
视频地址:https://www.bilibili.com/video/BV19E411W7BE 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀。 这次我选取的是自己唯一的爆款视频。就是下面这个。
萌萌哒的瓤瓤
2020/08/26
1.6K0
python爬取B站视频弹幕分析并制作词云
EDG夺冠,用Python分析一波:粉丝都炸锅了!
北京时间11月6日,在英雄联盟S11总决赛中,中国LPL赛区战队EDG电子竞技俱乐部以3∶2战胜韩国LCK赛区战队DK,获得2021年英雄联盟全球总决赛冠军。
数据分析与统计学之美
2023/11/10
2810
EDG夺冠,用Python分析一波:粉丝都炸锅了!
盘点一个哔哩哔哩弹幕抓取并词云可视化的项目
前几天在Python白银交流群【肉丸胡辣汤】问了一个Python网络爬虫和可视化的问题,提问截图如下:
Python进阶者
2022/11/14
4090
盘点一个哔哩哔哩弹幕抓取并词云可视化的项目
用Python爬取b站弹幕,看大家还会接受《爱情公寓5》吗?
为什么选择B站呢? 著名UP主“残狼之卑”,曾经在b站上传了几十个对比视频,做成《爱情公寓的抄袭史》,每期视频播放量都几十万,所以按理来说B站的用户反对爱情公寓的人应该很多。 如果B站的用户都可以接受,那么《爱5》可能真的会取得不错的播放量。 B站的弹幕数据是有接口的,比如说: https://comment.bilibili.com/********.xml 它以一个固定的url地址+视频的cid+.xml组成。只要找到你想要的视频cid,替换这个url就可以爬取所有弹幕了。 以刚才的视频为例
数据森麟
2019/10/23
6430
用Python爬取b站弹幕,看大家还会接受《爱情公寓5》吗?
用 Python 了解一下最炫国漫《雾山五行》
看动漫的小伙伴应该知道最近出了一部神漫《雾山五行》,其以极具特色的水墨画风和超燃的打斗场面广受好评,首集播出不到 24 小时登顶 B 站热搜第一,豆瓣开分 9.5,火爆程度可见一斑,就打斗场面而言,说是最炫动漫也不为过,当然唯一有一点不足之处就是集数有点少,只有 3 集。
Python小二
2020/08/17
6260
用Python爬取b站弹幕,看大家还会接受《爱情公寓5》吗?
尽管抄袭傍身,也没能阻挡《爱情公寓5》进击的脚步。 最近爱情公寓电视剧微博发布了长达8分钟的揭幕视频,官宣新季将在2020正式开播。 几位主演纷纷转发宣传,将#爱情公寓5揭幕#的话题送上了热搜。 观众在经历过一次《爱情公墓》的诈骗后,能否接受《爱情公寓5》(下文简称爱5)? 让我们来分析一下。 获取数据 首先,我选取了在B站上最热的视频,目前已经179万播放量,2万弹幕。
朱小五
2019/11/28
5550
推荐阅读
相关推荐
手把手带你B站少量弹幕爬取并生成词云
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档