【Python】获取视频弹幕并生成词云

news2024/11/30 10:27:59

目录

  • 一、摘要
  • 二、获取目标视频cid
  • 三、获取视频弹幕xml文件
  • 四、处理弹幕文件
  • 五、生成词云
  • 六、完整参考代码

一、摘要

就是那个大家都用的弹幕视频网站,不写名字了,写了老是不能通过。

获取视频的弹幕文件(xml),并生成如图所示的词云:

在这里插入图片描述
用到的技术有:

  1. 使用requests模块请求弹幕的xml文件;
  2. 使用xpath解析,获取xml文件中的字幕;
  3. 使用jieba对弹幕内容进行分词;
  4. 使用 wordcloud生成词云。

二、获取目标视频cid

这个网站的视频以前使用AV号来唯一标记一个视频,后来改为BV号(打开移动端APP在视频的详情处即可看到),通过这两种标识号码可以直接搜索到对应的视频。

此外,一个视频还可以用cid、aid、bvid等来标识,本文使用cid来构造HTTP请求。获取视频cid的方法之一是:

  1. 打开视频播放页面,(F12)检查页面;
  2. 选择network选项,并搜索cid;
  3. 点击其中一个结果,即可在payload选项下看到cid信息。
    在这里插入图片描述

当然也可以点击视频的统计信息,下载统计信息文件,然后搜索cid。或者在程序中实现通过URL获取cid,方式不唯一。

三、获取视频弹幕xml文件

请求弹幕文件的方法有两种(截止今天,我用到的):

在这里插入图片描述

其中将cid号换成目标视频的cid即可。

直接在地址栏输入上面的地址即可预览视频的xml文件,可见弹幕内容都在<p>标签下面
在这里插入图片描述
本文使用requests模块来获取该文件,并以cid号命名保存。

  # 下载视频弹幕的xml文件
    def dm_xml(self):
        url = 'https://comment.bilibili.com/' + self.cid+ '.xml'
        try:
            response = requests.get(url)
        except Exception as e:
            print('获取xml内容失败,%s' % e)
            return False
        else:
            if response.status_code == 200:
                with open(f'{self.cid}.xml','wb') as f:
                    f.write(response.content)
                    print('成功下载弹幕xml文件')
                    return True
            else:
                return False

四、处理弹幕文件

下载xml后,需要进行如下操作,得到wordcloud的标准输入(string):

  1. 对每个<p>标签内的内容进行解析,并将其拼接成字符串;
  2. 在使用jieba进行分词,将弹幕切分为一个个词语;
  3. 去掉停用词,比如啊、尽管、就是、因为这样的词语,它们大量出现,但却不能反映弹幕的真实情感。
    # 将xml文件中的文本提取出来,去掉停用词,分词
    def get_dm_txt(self):
        # 读取停用词,可以根据结果添加停用词
        with open("ChineseStopWords.txt", "r", encoding="utf-8") as fp:
            stopwords = [s.rstrip() for s in fp.readlines()]
        self.dm_xml()
        time.sleep(5)
        html = etree.parse(f'{self.cid}.xml', etree.HTMLParser())
        # xpath解析,获取当前所有的d标签下的所有文本内容
        text = html.xpath('//d//text()')
        # 列表拼接成字符串
        text = ''.join(text)
        text = jieba.lcut(text)
        words = []
        for w in text:
            if w not in stopwords:
                words.append(w)
        # 注意此处有空格
        words = ' '.join(words)
        return words

五、生成词云

使用wordcloud的generate()函数即可生成词云,再使用matplotlib显示即可。

此处要注意的一些参数有:

  1. collocations,此参数设置为False可以保证每个词云只出现一次;
  2. scale,缩放比例,该值越大,图像越清晰,但不宜太大,会导致加载变慢。
    # 生成词云
    def wd(self):
        # collocations用于去掉重复词语;scale值越大清晰度越高,但太大加载会变慢
        wd = WordCloud(font_path='simhei.ttf',colormap="spring",width=800,height=400,
                       collocations=False,scale=5).generate(self.get_dm_txt())
        # 保存图片
        wd.to_file(f'{self.cid}.PNG')
        plt.imshow(wd, interpolation='bilinear')
        plt.axis("off")
        plt.show()

六、完整参考代码

最后修改日期2023-1-9 20:57

读者可自行修改:如直接使用url下载,生成评论词云,设置词云形状等。

# -*- coding = utf-8 -*-
# @TIME :     2023-1-9 上午 12:24
# @Author :   CQUPTLei
# @File :     Bilibili_bullet_screen.py
# @Software : PyCharm
# @Abstract : 获取视频弹幕并做成词云
"""
截止本代码创作日,可以获取弹幕xml文件的请求方url有:
(url里面的一串数字是视频的cid)
    https://comment.bilibili.com/176244239.xml
    https://api.bilibili.com/x/v1/dm/list.so?oid=413440316
cid的获取:
    在相应的视频播放也,F12检查,network选项下搜索cid即可。
    Headers里面的RequURL里面就包含有cid
    或者Payload下也有,aid,cid,bvid之类的都有
有空了改进一下,直接通过视频URL湖区cid
"""
import time
import jieba
import requests
from lxml import etree
from wordcloud import WordCloud
import matplotlib.pyplot as plt

class Get_Bilibili_danmu(object):
    # 定义对象属性
    def __init__(self, cid):
        self.cid = cid

    # 下载视频弹幕的xml文件
    def dm_xml(self):
        url = 'https://comment.bilibili.com/' + self.cid+ '.xml'
        try:
            response = requests.get(url)
        except Exception as e:
            print('获取xml内容失败,%s' % e)
            return False
        else:
            if response.status_code == 200:
                with open(f'{self.cid}.xml','wb') as f:
                    f.write(response.content)
                    print('成功下载弹幕xml文件')
                    return True
            else:
                return False

    # 将xml文件中的文本提取出来,去掉停用词,分词
    def get_dm_txt(self):
        # 读取停用词,可以根据结果添加停用词
        with open("ChineseStopWords.txt", "r", encoding="utf-8") as fp:
            stopwords = [s.rstrip() for s in fp.readlines()]
        self.dm_xml()
        time.sleep(5)
        html = etree.parse(f'{self.cid}.xml', etree.HTMLParser())
        # xpath解析,获取当前所有的d标签下的所有文本内容
        text = html.xpath('//d//text()')
        # 列表拼接成字符串
        text = ''.join(text)
        text = jieba.lcut(text)
        words = []
        for w in text:
            if w not in stopwords:
                words.append(w)
        # 注意此处有空格
        words = ' '.join(words)
        return words

    # 生成词云
    def wd(self):
        # collocations用于去掉重复词语;scale值越大清晰度越高,但太大加载会变慢
        wd = WordCloud(font_path='simhei.ttf',colormap="spring",width=800,height=400,
                       collocations=False,scale=5).generate(self.get_dm_txt())
        # 保存图片
        wd.to_file(f'{self.cid}.PNG')
        plt.imshow(wd, interpolation='bilinear')
        plt.axis("off")
        plt.show()

if __name__ == '__main__':
    test_dm = Get_Bilibili_danmu('176244239')
    test_dm.wd()

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

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

相关文章

认真分享一个让我变厉害的小建议

很多朋友&#xff0c;加我好友之后&#xff0c;第一句话通常是&#xff1a;我想提高英语&#xff0c;有什么资料推荐&#xff1f; 这要看你学英语的目的了。 我们学英语是为了什么? 理由可能很多&#xff0c;我就说个最俗的目的吧&#xff0c;为了发财。 想发财应向谁学习&…

代码随想录第31天|● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

455.分发饼干 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子&#xff0c;那么就应该优先满足胃口大的。 这里的局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩。 可以尝试使用贪心策略&#xf…

[ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法

0 修路问题 有胜利乡有 7 个村庄(A, B, C, D, E, F, G) &#xff0c;现在需要修路把 7 个村庄连通各个村庄的距离用边线表示(权) &#xff0c;比如 A – B 距离 5 公里问&#xff1a;如何修路保证各个村庄都能连通&#xff0c;并且总的修建公路总里程最短? 思路: 将 10 条边&a…

Java常用工具类方法(上)

1. Collections首先出场的是java.util包下的Collections类&#xff0c;该类主要用于操作集合或者返回集合&#xff0c;我个人非常喜欢用它。1.1 排序在工作中经常有对集合排序的需求。看看使用Collections工具是如何实现升序和降序的&#xff1a;List<Integer> list new…

揭秘链动2+1商业模式玩法

链动21模式主要是打造裂变团队的同时又能快速地将平台销售额提升起来&#xff0c;链动模式可以说颠覆传统的分销&#xff0c;算是一个创新更能吸引用户&#xff0c;稳住会员&#xff0c;拓展新客户的商业模式。 链动21模式有两个身份&#xff0c;分别是代理和老板 【代理商】…

Java高手速成 | 高质量代码编写最佳实践

程序员之间交流时&#xff0c;会经常使用非程序员无法理解的行话&#xff0c;或者使用令操不同编程语言的程序员理解起来比较模糊的行话。 但是&#xff0c;那些操相同编程语言的程序员理解起来不会产生什么问题。 这有时也取决于程序员所掌握知识的渊博程度。 一个新手或许不理…

以 Animated Drawings APP 为例,用 TorchServe 进行模型调优

内容导读 上节介绍了 TorchServe 模型部署调优的 5 个步骤&#xff0c;将模型部署到生产环境中。本节以 Animated Drawings APP 为例&#xff0c;实际演示 TorchServe 的模型优化效果。 本文首发自微信公众号&#xff1a;PyTorch 开发者社区 去年&#xff0c;Meta 凭借 Animate…

win系统重装系统后提示 BitLocker(磁盘加密)密钥查找及如何关闭

文章目录前言如何找到恢复秘钥&#xff0c;解锁磁盘1、打开链接&#xff1a;[https://support.microsoft.com/zh-cn/help/4026181/windows-10-find-my-bitlocker-recovery-key](https://support.microsoft.com/zh-cn/help/4026181/windows-10-find-my-bitlocker-recovery-key)2…

Nuxt3+ElementPlus构建打包部署手记

文章目录为何选Nuxt.js?工程package.json参考目录结构页面之间的关系几个主要命令动态组件获取后台数据SSR打包方式部署参考文档为何选Nuxt.js? 在前后端分离出现之前&#xff0c;传统的web页面都是服务端渲染的&#xff0c;如JSP、PHP、Python Django&#xff0c;还有各种模…

06【Filter】

文章目录06【Filter】一、过滤器简介1.1 Filter概述1.2 Filter的使用1.2.1 Filter快速体验1.2.2 XML配置Filter1.2.3 Filter的拦截规则1.3 Filter的生命周期1.3.1 Filter生命周期介绍1.3.2 Filter生命周期相关方法1.3.3 FilterConfig类1.4 Filter的拦截方式1.4.1 REQUEST1.4.2 …

Linux系统编程——管道

文章目录一、管道1.管道的特质2.管道的用法——pipe函数3.管道的读写行为4..管道的优劣二.实战练习&#xff1a;实现ls | wc -l 指令三、fifo实现非血缘关系进程间通信一、管道 1.管道的特质 实现原理: 内核借助环形队列机制&#xff0c;使用内核缓冲区实现。 特质: 1.伪文件…

接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock

一、应用背景因为本章的内容是使用jq工具配合完成&#xff0c;因此在开始部分会先花一定的篇幅介绍jq机器使用&#xff0c;如果读者已经熟悉jq&#xff0c;可以直接跳过这部分。先来看应用场景&#xff0c;App 经常会有一些信息展示的列表页&#xff0c;比如商家的菜品、股票的…

真无线蓝牙耳机怎么选?分体式蓝牙耳机选购攻略及推荐

近年来&#xff0c;随着智能手机终端市场的崛起&#xff0c;无线蓝牙耳机的产销也随之呈持续增长的态势。真无线蓝牙耳机凭借其时尚、便捷性&#xff0c;迅速成为年轻人出门必备的数码单品之一。蓝牙耳机经过多年发展&#xff0c;其产品种类、品牌型号数不胜数。导致&#xff0…

springboot监听器的使用(ApplicationListener、SmartApplicationListener、@EventListener)

目录前言1. ApplicationListener1. 简单的全局监听2. 定时任务3. 监听自定义事件2. SmartApplicationListener1. 简单使用2. 方法介绍3. EventListener前言 监听器&#xff1a; 当某个事件触发的时候&#xff0c;就会执行的方法块。 springboot提供了两个接口来实现监听&…

Paddle进阶实战系列(一):保险文本视觉认知问答

保险文本视觉认知问答 1.项目介绍 1.1背景 随着人工智能技术的逐渐成熟&#xff0c;计算机视觉、语音、自然语言处理等技术在金融行业的应用从广度和深度上都在加速&#xff0c;这不仅降低了金融机构的运营和风险成本&#xff0c;而且有助于提升客户的满意度&#xff0c;比如…

Rhec第二次作业

两台机器&#xff1a;第一台机器作为客户端&#xff0c;第二台机器作为服务器&#xff0c;在第一台使用rhce用户免密登录第二台机器准备两台虚拟机并保证可以ping通网络&#xff0c;ip地址不一样第一台机器配置创建rhce用户在rhce用户上&#xff0c;创建密钥对并将公钥发送给第…

JDK源码(二)ConcurrentHashMap-JDK1.7

1.背景 并发编程中&#xff0c;ConcurrentHashMap是一个使用度非常高的数据结构。 优点: 线程安全相比于HashTable和Collections.synchronizedMap()效率高&#xff0c;使用了分段锁技术。 2.ConcurrentHashMap数据结构 Segment Segment继承了ReentrantLock&#xff0c;所以它…

Java设计模式-桥接模式Bridge

传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图: 类图 问题 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…

【Kotlin】标准库函数 ① ( apply 标准库函数 | let 标准库函数 )

文章目录一、apply 标准库函数二、let 标准库函数Kotlin 语言中 , 在 Standard.kt 源码中 , 为所有类型定义了一批标准库函数 , 所有的 Kotlin 类型都可以调用这些函数 ; 一、apply 标准库函数 Kotlin 标准库函数 中的 apply 函数 , 该函数可以看作 实例对象 的 配置函数 , 传…

现货黄金术语汇总

有的投资者可能并不是新手&#xff0c;可能之前对股票投资的一些术语有一定的了解甚至说是经验。但是转到现货黄金市场的时候&#xff0c;还是对很多术语感到很陌生&#xff0c;下面小编针对一些与股票不一样的现货黄金术语进行介绍&#xff0c;希望可以帮助投资者们尽快"…