b站弹幕新版API数据格式规格研究

前言

b站近期更新了弹幕接口返回的数据结构,我通过逆向JS代码进行研究,下面是研究成果。

API调用

GET https://api.bilibili.com/x/v2/dm/web/seg.so

参数:


oid 分P编号,也称为cid
type 1
segment_index 1

返回

请求正确:二进制数据流,需要解析后才能查看。

请求错误:JSON格式,结构是b站标准API数据结构。并附有错误信息。

返回数据流解析

应进行逐个字节解析。数据包以单条弹幕为单位。

以下面的数据为例:

0a45088780e0cdd4add64610ba011801201928ffffff07320831366333653632303a03e5a5bd40a38cb1fc05480162113339373836323937363339333035323233709fdaedba020a48088580a0a0c5aed64610ba011801201928ffffff07320831366333653632303a0632333333333340dd8cb1fc05480462113339373836333237383737303931333333709fdaedba020a53088380c0fed78fe94610c7ec021801201928ffffff073207343536623964333a12e783ad2020e8a1802020e6b2b82020e885be408edabafc0548076211333938363838333036333834303736383370fede99540a4e08838080e5e1c9ea4610ab89021801201928ffffff07320831333263353138643a0ce8bf99e4b99fe8a18cefbc8140b1b9bbfc054805621133393837353232343138303632313331357099a394090a45088580a093ff8db44710b881011801201928ffffff07320837616236656565653a026e6240b98ce1fc0548036211343031393836323539313937363234333770a6adccf8010a45088780a0fcb7fabb4710b199011801201928ffffff07320833323865356634333a026e6240dc8ee5fc05480562113430323333313338333439363730343037709feedfac020a57088580e0ddecb3bf471093b8031801201928ffffff07320833373032356533643a15e5bbbae8aeaee5869be8aeade694bee8bf99e9a69640dcf0e6fc05480162113430323438333035313537343036373235708f928230

数据太长了,我拆其中一条弹幕数据出来:

0a
45
08 8780e0cdd4add646
10 ba01
18 01
20 19
28 ffffff07
32 08 3136633365363230
3a 03 e5a5bd
40 a38cb1fc05
48 01
62 11 3339373836323937363339
// 这一段不知道什么意思,我逆向JS后看官方也没有解析这段。
333035323233709fdaedba02

0x0a 标识接下来的数据是单条弹幕。

紧接着的 0x45 标识数据主体长度,即后面的数据总长度。

接下来就是数据主体。第一个字节是数据类型,如0x08

这里要注意,所有

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
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等库进行数据分析和可视化。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值