Python获取B站视频弹幕 简单处理
时间:2022-07-23
本文章向大家介绍Python获取B站视频弹幕 简单处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
B站弹幕
概述
之前看到了网上有人做过一些up的B站弹幕数据可视化,感觉还挺有意思,于是自己就动手做着玩了一下(没有做可视化)。祝福武汉,祝福中国!
项目实现
(1)获取弹幕数据,我本来想着是获取某一个up的全部视频的弹幕数据,后来发现了一个问题:弹幕数据是存在JSON或者XMl中的。数据依靠一个id号标识,我本以为就是视频的av号,结果查看元素后却发现不是。参考了网上的一些文档发现弹幕数据存储在一个url中,因此只需要获取这个网址中的内容即可。
(2)获取数据,就采用爬虫惯用的requests模块即可
(3)解析数据
(4)数据持久化以及数据简单处理
初始化
首先初始化一些下面需要使用的基本参数
def __init__(self):
self.headers = {
# 自己添加自己的即可
}
self.base_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid={}'
self.url = ''
self.barrage_result = []
self.danmu = []
self.danmu_count = []
初始化自己的headers,以及初始化一个基础的url。然后初始化几个下面要用的参数。
获取网页
获取网页信息,并将数据存储到本地
# 获取信息
def get_page(self):
# 延时操作,防止太快爬取
time.sleep(0.5)
response = requests.get(self.url, headers=self.headers)
with open('bilibili.xml', 'wb') as f:
f.write(response.content
解析数据
解析网页,将所有弹幕信息存储在danmu列表中
# 解析网页 将所有弹幕信息存储在danmu列表中
def param_page(self):
time.sleep(1)
if self.barrage_result:
# 文件路径,html解析器
html = etree.parse('bilibili.xml', etree.HTMLParser())
# xpath解析,获取当前所有的d标签下的所有文本内容
results = html.xpath('//d//text()')
# 将去重后的弹幕存储起来
for one in results:
self.danmu.append(one)
print('总的实时弹幕数量:', len(self.danmu))
数据持久化
对获取到的数据进行简单处理,并持久化,由于后期还有其他的操作,因此我存了两种形式。
# 对获取的弹幕数据进行简单处理
def ana_result(self):
print('开始处理弹幕')
for one_danmu in self.danmu:
if one_danmu not in self.danmu_count:
self.danmu_count.append(one_danmu)
print('弹幕去重后数量为:', len(self.danmu_count))
with open('tanmu.txt', 'w', encoding='utf-8') as f:
for danmu in self.danmu_count:
# 数量的统计
amount = self.danmu.count(danmu)
f.write(danmu + ':' + str(amount) + 'n')
book = xlwt.Workbook(encoding='utf-8-sig', style_compression=0)
sheet = book.add_sheet('B站部分视频弹幕', cell_overwrite_ok=True)
sheet.write(0, 0, '弹幕内容')
sheet.write(0, 1, '弹幕出现次数')
n = 1
for danmu in self.danmu_count:
amount = self.danmu.count(danmu)
sheet.write(n, 0, danmu)
sheet.write(n, 1, amount)
n = n + 1
book.save(u'B站部分视频弹幕.xls')
一般而言数据持久化之后也就结束了,不过为了后面一些操作,在此处我又做的一个某关键字弹幕计数的功能
# 对含有某关键字的弹幕计数
def key_count(self, key):
value = key
pattern = '.*' + value + '.*'
tempList = []
for one in self.danmu:
obj = re.findall(pattern, one)
if len(obj) > 0:
tempList.extend(obj)
print('弹幕中含有', key, '的弹幕数量为:', len(tempList))
整个爬虫我用以下程序段调用。
def run(self):
for i in range(145134329, 145144329):
self.get_url(i)
self.barrage_result = self.get_page()
self.param_page()
self.key_count('武汉加油')
self.key_count('武汉')
self.ana_result()
在range中填写一个oid列表,遍历这个列表去抓取弹幕数据。如果没有已知oid列表可以像我上面的方法去遍历。
运行时界面如下。
- Centos7下yum安装配置nginx与php
- CentOS7安装MySQL
- 分布式系统唯一ID生成方案汇总
- 操作系统底层技术——CPU亲和性
- AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行
- mongoDB报错Cannot find module '../build/Release/bson'
- 计算机视觉处理三大任务:分类、定位和检测
- Windows下RabbitMQ安装及入门
- 计算机视觉任务:图像梯度和图像完成
- Yarn【label-based scheduling】实战总结(一)
- 配置sonarqube+maven
- Yarn【label-based scheduling】实战总结(二)
- HDFS学习:HDFS机架感知与副本放置策略
- spring cloud 报错Error creating bean with name 'hystrixCommandAspect' ,解决方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- phpjiami 数种解密方法
- Hbase-2.0.0_03_Hbase数据模型
- ELK-elasticsearch-6.3.2部署
- Real World CTF 2018 bookhub 总结
- python http.server open redirect vulnerability
- ELK-elasticsearch-6.3.2插件【head,bigdesk,cerebro[kopf]】安装
- ELK-kibana-6.3.2部署
- node.js + postgres 从注入到Getshell
- ELK-logstash-6.3.2部署
- K8S节点异常怎么办?TKE"节点健康检查和自愈"来帮忙
- ELK-logstash-6.3.2-常用配置
- ELK-elkstack-使用消息队列
- kafka_2.11-2.0.0_安装部署
- 谈escapeshellarg绕过与参数注入漏洞
- Django debug page XSS漏洞(CVE-2017-12794)分析