[爬虫] 爬取B站的弹幕,通过bvid或者a_id、c_id

起因:

我需要爬取B站的动漫信息,包括弹幕

可能用到的API:

获取动漫的每集信息(包含a_id和c_id)

https://api.bilibili.com/pgc/web/season/section?season_id=34404

获取弹幕(需要a_id和c_id)

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

主要代码

参考了 http://t.csdnimg.cn/ZD1A7

import jsonimport requests
import google.protobuf.text_format as text_format
import dm_pb2 as Danmaku
import reclass BEngine():"""bilibili引擎"""def __init__(self):self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}def do_request(self, url):headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"}r = requests.get(url, headers=headers)if r.status_code == 200:r.encoding = 'utf-8'return r.textelse:return Falsedef get_video_cid(self, bvid):"""通过bvid获取cid:param bvid::return:"""api_url = f'https://api.bilibili.com/x/web-interface/view?bvid={bvid}'try:html = self.do_request(api_url)if html:_json = json.loads(html)cid = _json['data'].get('cid')return cidelse:return Falseexcept:return Falsedef bvid_to_avid(self, bvid):"""通过bvid获取avid:param bvid::return:"""table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'tr = {}for i in range(58):tr[table[i]] = is = [11, 10, 3, 8, 4, 6]xor = 177451812add = 8728348608def dec(x):r = 0for i in range(6):r += tr[x[s[i]]] * 58 ** ireturn (r - add) ^ xorreturn dec(bvid)def avid_to_bvid(self, avid):table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'tr = {}for i in range(58):tr[table[i]] = is = [11, 10, 3, 8, 4, 6]xor = 177451812add = 8728348608def dec(x):r = 0for i in range(6):r += tr[x[s[i]]] * 58 ** ireturn (r - add) ^ xordef enc(x):x = (x ^ xor) + addr = list('BV1  4 1 7  ')for i in range(6):r[s[i]] = table[x // 58 ** i % 58]return ''.join(r)return enc(avid)def get_danmu(self, avid, cid):"""通过so文件获取解密后的弹幕列表:return:"""result = []url = 'http://api.bilibili.com/x/v2/dm/web/seg.so'params = {'type': 1,  # 弹幕类型'oid': cid,  # cid'pid': avid,  # avid'segment_index': 1  # 弹幕分段}resp = requests.get(url, params, headers=self.headers)data = resp.contentdanmaku_seg = Danmaku.DmSegMobileReply()danmaku_seg.ParseFromString(data)# 使用MessageToDict 就不用使用parse_danmuresult = MessageToDict(danmaku_seg, preserving_proto_field_name=True)['elems']# for j in danmaku_seg.elems:#     parse_data = text_format.MessageToString(j, as_utf8=True)#     rstrip = parse_data.replace("\n", ",").rstrip(",")# result.append(rstrip)# print(result)return resultdef parse_danmu(self, danmu_list):"""解析出每个弹幕列表内容:param danmu_list::return:"""result = []for each_dm in danmu_list:res = re.findall('''id: \d+,progress: (\d+),mode: (\d+),fontsize: (\d+),color: (\d+),midHash: "(.*?)",content: "(.*?)",ctime: (\d+),weight: (\d+),idStr: "(\d+)"''',each_dm)if res and len(res[0]) == 9:item = {"progress": res[0][0],"mode": res[0][1],"fontsize": res[0][2],"color": res[0][3],"midHash": res[0][4],"content": res[0][5],"ctime": res[0][6],"weight": res[0][7],"idStr": res[0][8],}result.append(item)else:continuereturn resultdef getdanmu_format(self, bvid):"""弹幕直接格式化:param bvid::return:"""avid = e.bvid_to_avid(bvid)cid = e.get_video_cid(bvid)return self.get_danmu(avid, cid)def getdanmu_format_by_avid(self, avid, cid):"""弹幕直接格式化:param bvid::return:"""return self.get_danmu(avid, cid)if __name__ == '__main__':e = BEngine()print(e.getdanmu_format_by_avid(656835181, 1154635809))bvid = "BV1Dz4y1L7hj"# print(e.getdanmu_format(bvid))
其他参考

http://t.csdnimg.cn/WPhPA

http://t.csdnimg.cn/N4Sry

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

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

相关文章

html的表格标签

html的表格标签 table标签:表示整个表格tr:表示表格的一行td:表示一个单元格th:表示表头单元格.会居中加粗thead:表格的头部区域 (注意和th区分,范围是比th要大的).tbody:表格得到主体区域. table包含tr , tr包含td或者th. 表格标签有一些属性,可以用于设置大小边…

Codeforces Round 920 (Div. 3)

D. Very Different Array(贪心双指针/前缀和) 思路:绝对值就是线段-->让线段最长(肯定是越在最短端找最右端的 越最右端找最左端的)-->判断怎么连哪段最长(采用双指针的策略去判断) (左红…

七天爆肝flink笔记

一.flink整体介绍及wordcount案例代码 1.1整体介绍 从上到下包含有界无界流 支持状态 特点 与spark对比 应用场景 架构分层 1.2示例代码 了解了后就整个demo吧 数据源准备 这里直接用的文本文件 gradle中的主要配置 group com.example version 0.0.1-SNAPSHOTjava {sour…

通过`ssh`同步`tmux`剪贴板内容

通过ssh同步tmux剪贴板内容 通过ssh连接远程服务器时,可以通过xclip同步tmux剪贴板内容。这需要在服务器上安装xclip,且需要在ssh远程连接时开启X11。 此处附tmux剪贴板调用xclip的配置: # Copy the current buffer to the system clipboa…

网络爬虫实战 | 上传以及下载处理后的文件

以实现爬虫一个简单的(SimFIR (doctrp.top))网址为例,需要遵循几个步骤: 1. 分析网页结构 首先,需要分析该网页的结构,了解图片是如何存储和组织的。这通常涉及查看网页的HTML源代码,可能还包…

[Python进阶] 使用__import__函数动态导入模块

2.16 使用__import__函数动态导入模块 在Python中,__import__是一个内置函数,用于动态导入模块。它的语法如下: import(name, globalsNone, localsNone, fromlist(), level0) 其中,name是要导入的模块名称,globals和l…

基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ECG信号的特点与噪声 4.2 FPGA在ECG信号处理中的应用 4.3 ECG信号滤波原理 4.4 心率计算原理 4.5 FPGA在ECG信号处理中的优势 5.算法完整程序工程 1.算法运行效果图预览 其RTL结构如…

C++集群聊天服务器 muduo+nginx+redis+mysql数据库连接池 笔记 (下)

C集群聊天服务器 网络模块业务模块CMake构建项目 笔记 (上)-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135991635?spm1001.2014.3001.5501C集群聊天服务器 数据模块业务模块CMake构建项目 笔记 (上)-CSDN博…

QT-通信编码格式问题

这里写目录标题 一、项目场景1.QT客户端与服务端通信时,转化步骤如下:2.原数据示例3.转化后数据 二、问题描述1.采用Soap协议2.采用HTTP协议 三、原因分析四、解决方案 一、项目场景 1.QT客户端与服务端通信时,转化步骤如下: 1&…

free pascal:fpwebview 组件通过JSBridge调用本机TTS

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr ,编写 js_bind_speak.lpr 如下,通过JSBridge调用本机…

【软件设计模式之命令模式】

文章目录 一、命令模式简介1. 定义2. 核心概念a. 命令(Command)b. 接收者(Receiver)c. 调用者(Invoker)d. 客户端(Client) 二、命令模式的实际应用1. 命令模式的优点a. 解耦发起者和…

协调尺度:特征缩放在机器学习中的重要作用

目录 一、介绍 二、背景知识 三、了解功能缩放 四、特征缩放方法 五、特征缩放的重要性 六、实际意义 七、代码 八、结论 一、介绍 特征缩放是机器学习和数据分析预处理阶段的关键步骤,在优化各种算法的性能和效率方面起着至关重要的作用。本文深入探讨了特征缩放的…

什么是内存对齐?如何计算结构体类型的大小?

结构体内存对齐与结构体类型的大小 运行这样一段代码 我们想要计算这两个结构体类型的大小,而这个结构体类型里面成员变量有一个int类型和两个char类型,大小加起来应该是六个字节,但是我们打印出来发现,结果居然是12和8&#xff…

4.5 用qml实现横向滑动的多个页面

一、效果展示 带上main.qml,一共4个page。第4个page上面有一个按钮,点击则会直接返回的到首页,也就是第1个page。 二、main.qml中的代码 import QtQuick import QtQuick.Controls //若要使用控件,则导入该包ApplicationWindow …

记录 | ubuntu pyqt5 pycharm配置

Ubuntu16.04pycharmpyqt5安装与配置_ubuntu pycharm pyqt5-CSDN博客pycharm激活码 6ZUMD7WWWU-eyJsaWNlbnNlSWQiOiI2WlVNRDdXV1dVIiwibGljZW5zZWVOYW1lIjoiSmV0cyBHcm91cCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN…

Apache httpd 换行解析漏洞复现(CVE-2017-15715)

Web页面&#xff1a; 新建一个一句话木马&#xff1a; 0.php <?php system($_GET[0]); ?> 上传木马&#xff0c; burpsuite 抓包。 直接上传是回显 bad file。 我们查看数据包的二进制内容&#xff08;hex&#xff09;&#xff0c;内容是以16进制显示的&#xff0c;…

【Go语言】第一个Go程序

第一个 Go 程序 1 安装 Go Go语言官网&#xff1a;Download and install - The Go Programming Language&#xff0c;提供了安装包以及引导流程。 以 Windows 为例&#xff0c;进入windows安装包下载地址&#xff1a;All releases - The Go Programming Language&#xff0c…

指针和句柄的区别和联系

句柄&#xff08;Handle&#xff09;和指针&#xff08;Pointer&#xff09;都是在计算机编程中用于引用内存地址的概念&#xff0c;但它们有一些关键的区别和联系。 区别&#xff1a; 指向对象的类型&#xff1a; 指针&#xff1a; 指针是直接存储一个变量或对象的内存地址的…

unity的重中之重:组件

检查器&#xff08;Hierarchy&#xff09;面板中的所有东西都是组件。日后多数工作都是和组件打交道&#xff0c;包括调参、自定义脚本组件。 文章目录 12 游戏的灵魂&#xff0c;脚本组件13 玩转脚本组件14 尽职的一生&#xff0c;了解组件的生命周期15 不能插队&#xff01;…

(力扣记录)1448. 统计二叉树中好节点的数目

数据结构&#xff1a;树&#x1f332; 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(n) 代码实现&#xff1a; class Solution:def goodNodes(self, root: TreeNode) -> int:counter [0]def dfs(root, val):if not root: returnnext_val valif root.val > …