BiliBili爬取弹幕制作词云

今天我在CSDN看到了一篇文章,可以把一大段文字使用Python的WordCloud库生成一张图,出现频率越多的词在图上的大小越大,这种图叫做词云。斯…我突发奇想:之前学过网络爬虫,如果我把B站的弹幕爬取下来,做成词云…嗯…开始实践!

分析思路

我们要爬取一个视频的弹幕,先要分析一下B站的视频地址结构,这里先搞了几个视频

https://www.bilibili.com/video/BV1Qd4y1d7px
https://www.bilibili.com/video/BV1HL4y1577D
https://www.bilibili.com/video/BV14P4y1A7UG

em,可以看到结构大致为https://www.bilibili.com/video/BV后面10位大小写字母和数字组合而成

知道了地址结构,下面来说说视频的弹幕,每一个视频都有一个xml文件,里面写了这个视频弹幕都有那些,在几分几秒,什么颜色之类的。

然后我们随便选择一个视频,按F12打开开发者工具,点击Network一栏,Ctrl+R重新加载一下,选第一个BV开头的,选ResponseCtrl+F搜索cids,看到这串蓝色的数字就是这个视频的cid

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Njtx9wNK-1691069620860)(https://file.yupenbob.ml/img/202209142121717.jpg)]

关于B站弹幕xml地址我查了好多文章,总结xml地址位http://comment.bilibili.com/"这里写cid".xml,列如视频URL为https://www.bilibili.com/video/BV1Qd4y1d7px的视频,BV为1Qd4y1d7px,cid为https://comment.bilibili.com/815259646.xml,弹幕xml内容如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfNYSYnr-1691069620860)(https://file.yupenbob.ml/img/202209142134025.png)]

有了xml弹幕信息后面就好弄了,直接把所有弹幕分词,生成词云就OK了


准备

我们来准备一下这个项目所需要的东西

第三方库

首先安装这个项目所需的第三方库,比较多
使用pip安装wordcloud词云生成库

pip install wordcloud

由于要设计图形处理,要安装PIL库

pip install pillow

安装numpy库,用来处理词云文字颜色

pip install numpy

由于要解析XML,需安装lxml库

pip install lxml

因为需要涉及到正则表达式,要安装re库

pip install re

最重要的爬取网站!需要安装requests库!

pip install requests

字体

这里就拿微软雅黑吧

模板图片

这里生成词云用到的模板图片,我就拿我头像吧,改个色

开始

好的,接下来让我们开始写程序

导入第三方库

像这样全部搞里头!

from wordcloud import ImageColorGenerator
from wordcloud import WordCloud
from lxml import etree
from PIL import Image
import requests,jieba,re
import numpy as np

设置http请求头

首先B站有反爬,需要设置http请求头,em我就直接把我浏览器里的搬过来了

#http请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}

解析视频弹幕xml地址

#解析视频弹幕xml地址
def DanmuURL_get(bv):
    print("解析视频弹幕xml地址")
    video_url = bv
    print("BV:"+video_url)
    response = requests.get(video_url, headers=headers) #获取html
    html = response.content.decode()
    cid = re.findall(r'("cid":)([0-9]+)', html) #获取cid
    xml_url = "http://comment.bilibili.com/" + str(cid[0][1]) + ".xml"
    return xml_url

获取弹幕信息

def Danmu_get(xml_url):
    print("获取弹幕信息")
    print("XML:" + xml_url)
    response = requests.get(xml_url, headers=headers)  # 获取信息
    html = etree.HTML(response.content)
    danmu_list = html.xpath("//d/text()")  # 解析xml
    return danmu_list

初始化定义

danmu_list = []  # 定义弹幕列表
txt = ""  # 定义弹幕文本
# 需要爬取的视频BV
bv = [
    "https://www.bilibili.com/video/BV1HL4y1577D",
    "https://www.bilibili.com/video/BV1dr4y1H77b",
    "https://www.bilibili.com/video/BV1h34y1k7m1",
    "https://www.bilibili.com/video/BV14P4y1A7UG",
    "https://www.bilibili.com/video/BV1ES4y1y7K1",
    "https://www.bilibili.com/video/BV1tL4y1c7hj",
    "https://www.bilibili.com/video/BV1LB4y1X7Nj",
    "https://www.bilibili.com/video/BV1ya411W7Lv",
    "https://www.bilibili.com/video/BV1aa411Z7U2",
    "https://www.bilibili.com/video/BV1Qd4y1d7px",
]

词云生成

# 词云生成
def WordCloud_make(danmuimg, txt):
    mask = np.array(Image.open(danmuimg))  # 导入背景图片
    color = ImageColorGenerator(mask, default_color=None)  # 分析背景文字颜色
    wordcloud = WordCloud(  # 都可以随便修改
        background_color="white",  # 背景颜色
        max_words=114514,  # 最大词量(喜)
        mask=mask,  # 导入图片
        color_func=color,  # 文字颜色
        max_font_size=120,  # 最大文字大小
        font_path="msyhbd.ttc"  # 字体
    ).generate(txt)
    wordcloud.to_file('out.jpg')  # 输出图片
    print("生成完毕,输出图片out.jpg")

主程序开始

# 程序开始
if __name__ == '__main__':
    # 开始调用
    for i in bv:
        xml_url = DanmuURL_get(i)
        danmu_list = Danmu_get(xml_url)
        # 拼接danmu_list
        for a in danmu_list:
            txt = txt + a

    # 生成
    print("获取完成,正在生成词云")
    WordCloud_make("back.jpg", txt)

ok这样就完成了


最终代码

不想一步步来的可以直接复制此代码

from wordcloud import ImageColorGenerator
from wordcloud import WordCloud
from lxml import etree
from PIL import Image
import requests, jieba, re
import numpy as np

# http请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}

danmu_list = []  # 定义弹幕列表
txt = ""  # 定义弹幕文本
# 需要爬取的视频BV
bv = [
    "https://www.bilibili.com/video/BV1HL4y1577D",
    "https://www.bilibili.com/video/BV1dr4y1H77b",
    "https://www.bilibili.com/video/BV1h34y1k7m1",
    "https://www.bilibili.com/video/BV14P4y1A7UG",
    "https://www.bilibili.com/video/BV1ES4y1y7K1",
    "https://www.bilibili.com/video/BV1tL4y1c7hj",
    "https://www.bilibili.com/video/BV1LB4y1X7Nj",
    "https://www.bilibili.com/video/BV1ya411W7Lv",
    "https://www.bilibili.com/video/BV1aa411Z7U2",
    "https://www.bilibili.com/video/BV1Qd4y1d7px",
]


# 解析视频弹幕xml地址
def DanmuURL_get(bv):
    print("解析视频弹幕xml地址")
    video_url = bv
    print("BV:" + video_url)
    response = requests.get(video_url, headers=headers)  # 获取信息
    html = response.content.decode()
    cid = re.findall(r'("cid":)([0-9]+)', html)  # 获取cid
    xml_url = "http://comment.bilibili.com/" + str(cid[0][1]) + ".xml"
    return xml_url


# 获取弹幕信息
def Danmu_get(xml_url):
    print("获取弹幕信息")
    print("XML:" + xml_url)
    response = requests.get(xml_url, headers=headers)  # 获取信息
    html = etree.HTML(response.content)
    danmu_list = html.xpath("//d/text()")  # 解析xml
    return danmu_list

# 词云生成
def WordCloud_make(danmuimg, txt):
    mask = np.array(Image.open(danmuimg))  # 导入背景图片
    color = ImageColorGenerator(mask, default_color=None)  # 分析背景文字颜色
    wordcloud = WordCloud(  # 都可以随便修改
        background_color="white",  # 背景颜色
        max_words=114514,  # 最大词量(喜)
        mask=mask,  # 导入图片
        color_func=color,  # 文字颜色
        max_font_size=120,  # 最大文字大小
        font_path="msyhbd.ttc"  # 字体
    ).generate(txt)
    wordcloud.to_file('out.jpg')  # 输出图片
    print("生成完毕,输出图片out.jpg")


# 程序开始
if __name__ == '__main__':
    # 开始调用
    for i in bv:
        xml_url = DanmuURL_get(i)
        danmu_list = Danmu_get(xml_url)
        # 拼接danmu_list
        for a in danmu_list:
            txt = txt + a

    # 生成
    print("获取完成,正在生成词云")
    WordCloud_make("back.jpg", txt)

运行

来看一下效果如何吧,示例用以下几段视频

bv = [
    "https://www.bilibili.com/video/BV1HL4y1577D",
    "https://www.bilibili.com/video/BV1dr4y1H77b",
    "https://www.bilibili.com/video/BV1h34y1k7m1",
    "https://www.bilibili.com/video/BV14P4y1A7UG",
    "https://www.bilibili.com/video/BV1ES4y1y7K1",
    "https://www.bilibili.com/video/BV1tL4y1c7hj",
    "https://www.bilibili.com/video/BV1LB4y1X7Nj",
    "https://www.bilibili.com/video/BV1ya411W7Lv",
    "https://www.bilibili.com/video/BV1aa411Z7U2",
    "https://www.bilibili.com/video/BV1Qd4y1d7px",
]

日志如下

解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1HL4y1577D
获取弹幕信息
XML:http://comment.bilibili.com/572081457.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1dr4y1H77b
获取弹幕信息
XML:http://comment.bilibili.com/563748171.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1h34y1k7m1
获取弹幕信息
XML:http://comment.bilibili.com/518688148.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV14P4y1A7UG
获取弹幕信息
XML:http://comment.bilibili.com/497618147.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1ES4y1y7K1
获取弹幕信息
XML:http://comment.bilibili.com/497090740.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1tL4y1c7hj
获取弹幕信息
XML:http://comment.bilibili.com/710618932.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1LB4y1X7Nj
获取弹幕信息
XML:http://comment.bilibili.com/733727872.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1ya411W7Lv
获取弹幕信息
XML:http://comment.bilibili.com/759671800.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1aa411Z7U2
获取弹幕信息
XML:http://comment.bilibili.com/791084545.xml
解析视频弹幕xml地址
BV:https://www.bilibili.com/video/BV1Qd4y1d7px
获取弹幕信息
XML:http://comment.bilibili.com/815259646.xml
获取完成,正在生成词云
生成完毕,输出图片out.jpg

进程已结束,退出代码0

输出图片

如果你电脑有配置的话,可以试试把全B站的视频都输入进去[doge]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值