适用于linux的bilibiliB站直播间弹幕爬虫脚本

linux,bilibilib · 浏览次数 : 0

小编点评

```python import requests from bs4 import BeautifulSoup import time class Danmu(): def __init__(self): self.t = False # 其他成员变量和方法定义省略 def get_danmu_once(self): # 获取直播间弹幕,并循环打印 html = requests.post(self.url,headers=self.headers,data=self.data).json() # ...逻辑省略 def get_danmu_circle(self): # 后续获取直播间弹幕,则不可靠地找到上次记录的最后一条弹幕,然后输出其(不含)后面的弹幕 html = requests.post(self.url,headers=self.headers,data=self.data).json() # ...逻辑省略 def main(): # 获取房间号 room_id = input("请输入直播间ID:") # ...其他变量和方法定义省略 # 创建bDanmu实例 bDanmu = Danmu() # 获取直播间弹幕,并循环打印 while bDanmu.t==False: bDanmu.get_danmu_once() # 每隔10秒检查直播间弹幕,防止获取重复数据 time.sleep(10) # 获取弹幕,并循环打印 while True: bDanmu.get_danmu_circle() # 每隔10秒检查直播间弹幕,防止获取重复数据 time.sleep(10) if __name__ == "__main__": main() ```

正文

适用于linux的bilibiliB站直播间弹幕爬虫脚本,命令行运行之,输入到命令行,部分内容参考自网络,代码底部可见原始代码出处
BUFF:然而,经测试,每次爬只能读取10条弹幕记录,这就使得在(sleeptime*10)(每秒)<弹幕新增量(每秒)时出现弹幕丢失的情况,此时需要调短sleeptime,由于本脚本是自用目的(我的粉丝数是个数),因此该bug对我本人暂无影响,有需要修复该bug的读者请留言或自行修复

# -*- coding:utf-8 -*-
# 时间:2024/4/26
# 原作者:猫先生的早茶
# 二创:wc1945451904@163.com
#!/usr/bin/python
#"""
#    获取bilibili直播间弹幕
#    房间号从网页源代码中获取
#    打开直播画面后,按ctrl+u 打开网页源代码,按ctrl+f 搜索 room_id
#    搜到的"room_id":1016中,1016就是房间号 
#    获取不同房间的弹幕:修改代码第26行的roomid的值为对应的房间号roomid,或者通过公共设置处的变量来设置之
#    先在直播间手动输入一条弹幕,再开启该脚本
#"""

# wc:使用python在命令行中启动脚本,需要提前安装request 包,conda install requests或者
# pip install requests

import requests;
import time;
#公共设置
sleeptime = 3;#此处修改抓取间隔
groomid = '12159402'#二创者的直播间id(^_^)
if(groomid==''):
    print("未设置目标直播间id");
    return;
#彩色转译
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
MAGENTA = '\033[95m'
CYAN = '\033[96m'
RESET = '\033[0m'
class Danmu():
    def __init__(self):
        self.t = False;#保证第一次循环一定要获取弹幕,然后进入第二循环
        self.lastMsg = '';
        self.lastTime = '';
        self.lastNickname = '';

        # 弹幕url
        self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory';
        # 请求头
        self.headers = {
            'Host':'api.live.bilibili.com',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
        }
        # 定义POST传递的参数
        self.data = {
            'roomid':groomid,#!!!修改为roomId
            'csrf_token':'',
            'csrf':'',
            'visit_id':'',
        }
        
    def get_danmu_once(self):
        # 第一次获取直播间弹幕,全部打印
        html = requests.post(url=self.url,headers=self.headers,data=self.data).json();
        # 
        # 弹幕列表逐项提取
        #逻辑:先打印,再判断并修改self.t
        #如果弹幕很少,则会
        if self.t==False:
            for content in html['data']['room']:
                self.lastTime = content['timeline']
                self.lastNickname = content['nickname'];
                self.lastText = content['text'];
                print(f"{GREEN}{self.lastTime}{BLUE}{self.lastNickname}{RESET}"+'\t:'+self.lastText)
                #print('\t:'+self.lastText)
                #outmsg = self.lastTime+self.lastNickname+'\t:'+self.lastText;
                #print(outmsg);        
            if(self.lastTime!=''):
                self.t = True;
    
    def get_danmu_circle(self):
        # 后续获取直播间弹幕,则不可靠地找到上次记录的最后一条弹幕,然后输出其(不含)后面的弹幕
        html = requests.post(url=self.url,headers=self.headers,data=self.data).json();
        count = 0;#开关
        # 弹幕列表逐项提取
        for content in html['data']['room']:
            # 整合[     昵称+对话内容    ]输出
            if(count == 1):#此处为第一条新增弹幕,输出之
                self.lastTime = content['timeline']
                self.lastNickname = content['nickname'];
                self.lastText = content['text'];
                print(f"{GREEN}{self.lastTime}{BLUE}{self.lastNickname}{RESET}"+'\t:'+self.lastText)
                #outmsg = self.lastTime+self.lastNickname+'\t:'+self.lastText;
                #print(outmsg);
                
            # 判断新弹幕
            elif(self.lastTime>=content['timeline']
                 and self.lastNickname==content['nickname']
                 and self.lastText==content['text']):
                        count = 1;#
                        continue;
        #     sum+=1;
        # print("==============sum == %d",sum);


# 创建bDanmu实例
bDanmu = Danmu();

while bDanmu.t==False:#False表示爬虫的弹幕列表为空
    time.sleep(sleeptime);
    bDanmu.get_danmu_once();

while True:
    # 每隔x秒就检查一下直播间弹幕
    time.sleep(sleeptime);
    # 获取弹幕
    bDanmu.get_danmu_circle();  
                  
#原作者原文链接:https://blog.csdn.net/qq_43017750/article/details/107771744

与适用于linux的bilibiliB站直播间弹幕爬虫脚本相似的内容:

适用于linux的bilibiliB站直播间弹幕爬虫脚本

适用于linux的bilibiliB站直播间弹幕爬虫脚本,命令行运行之,输入到命令行,部分内容参考自网络,代码底部可见原始代码出处 BUFF:然而,经测试,每次爬只能读取10条弹幕记录,这就使得在(sleeptime*10)(每秒)<弹幕新增量(每秒)时出现弹幕丢失的情况,此时需要调短sleepti

Windows 交叉编译之 make

如果需要在 Windows 平台交叉编译适用于 Linux 的程序文件,可否也使用 Make ?

[转帖]S3FS 简介及部署

PS:文章一般都会先首发于我的个人Blog上:S3FS 简介及部署 · TonghuaRoot's BloG. ,有需要的小伙伴可以直接订阅我的Blog,获取最新内容。 0x00 前言 S3FS可以把S3 Bucket可以向挂盘一样,挂在本地,适用于Linux和Mac OS,完事复制粘贴写文件啥的跟

windows下使用dockerdesktop进行部署

Docker部署springboot项目 环境准备 要在windows上使用docker需要确认系统的需求 需要启用虚拟化支持的CPU 启用适用于windows的Linux子系统功能 保证足够的内存 下载dockerdesktop 下载后会提示安装对应的环境 坑点 安装过程中需要安装wsl环境,会遇

文件系统(六):一文看懂linux ext4文件系统工作原理

liwen01 2024.06.09 前言 Linux系统中的ext2、ext3、ext4 文件系统,它们都有很强的向后和向前兼容性,可以在数据不丢失的情况下进行文件系统的升级。目前ext4是一个相对较成熟、稳定且高效的文件系统,适用于绝大部分规模和需求的Linux环境。 ext4它突出的特点有:数

[转帖]fio 命令入门到跑路

fio是一种I / O工具,用于基准测试和压力/硬件验证。它支持19种不同类型的I / O引擎(sync,mmap,libaio,posixaio,SG v3,splice,null,network,syslet,guasi,solarisaio等),I / O优先级(适用于较新的Linux内核)

Ollama开发指南

安装必备工具 确保已安装以下软件的正确版本: CMake 3.24 或更高版本 Go 1.22 或更高版本 GCC 11.4.0 或更高版本 使用 Homebrew 安装这些工具(适用于macOS和Linux): brew install go cmake gcc 可选:启用调试与详细日志 构建时开

[转帖]对磁盘进行基准检验

对磁盘进行基准检验https://learn.microsoft.com/zh-cn/azure/virtual-machines/disks-benchmarks 适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集 ✔️ 统一规模集 基准测试是指模拟应用程序的不同工作负荷

Linux Debian安装教程

本教程介绍了如何安装和配置 Linux Debian 操作系统,包括虚拟机创建、开启虚拟化、操作系统安装和SSH远程连接,适用于初学者和有经验的用户。

创建Avalonia 模板项目-基础

# 创建Avalonia 模板项目-基础 Avalonia是一个跨平台的.NET框架,用于构建漂亮、现代的图形用户界面(GUI)。使用Avalonia,您可以从单个代码库创建适用于Windows、macOS、 Linux、iOS、Android和Web Assembly的原生应用程序。 本文部分内容