首页 > 系统相关 >适用于linux的bilibiliB站直播间弹幕爬虫脚本

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

时间:2024-05-31 19:44:13浏览次数:30  
标签:bilibiliB 直播间 self content linux lastNickname lastTime 弹幕

适用于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

标签:bilibiliB,直播间,self,content,linux,lastNickname,lastTime,弹幕
From: https://www.cnblogs.com/djwca/p/18225183

相关文章

  • Linux压缩、解压缩指令
    tar【tar指令是打包指令,最后打包后的文件是.tar.gz文件】 案例1:压缩多个文件,将/home/pig.txt和/home/cat.txt压缩成pc.tar.gztar-zcvfpc.tar.gz/home/pig.txt/home/cat.txt案例2:将/home的文件夹压缩成myhome.tar.gztar-zcvfmyhome.tar.gz/hom......
  • Linux下的并发与竞争
    文章目录前言一、原子操作二、自旋锁三、读写自旋锁四、信号量五、互斥体总结前言Linux系统是个多任务操作系统,并发访问带来的问题就是竞争,所谓的临界区就是共享数据段,要保证临界区是原子访问的。主要方法有四种:原子操作,自旋锁,信号量,互斥体。本文主要介绍内核下各方......
  • linux 文件属性被替换修改查询并修改
    系统服务发布本来非常正常,但是今天不知道为什么,打包发布异常,删除文件目录的权限都没有。上网搜索后,最终找到文件属性被修改,导致无法删除。通过lsattr命令查询文件的属性,如果出现,其中----i-----------的文件是属性被修改的。查找文件时,注意,隐藏文件也要查询。[root@localhost......
  • 【LINUX】LINUX基础(目录结构、基本权限、基本命令)
    文章目录LINUX的目录结构LINUX的基本权限LINUX基本命令LINUX的目录结构/:表示根目录bin:存放二进制可执行文件(命令ls、cat、mkdir等)boot:存放系统引导文件dev:存放设备文件etc:存放系统配置文件home:存放当前用户的文件(~表示当前用户默认目录、…则是上一级目录、-表......
  • archlinux安装yay和微信
    1.增加archlinuxcn源,编辑/etc/pacman.conf文件,在最后添加如下内容:[archlinuxcn]Server=https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch2.设置在本地信任farseerfc的GPGkey:sudopacman-key--lsign-key"farseerfc@archlinux.org"3.安装archlinuxcn-keyring......
  • 每天一个Linux命令(1):xargs
    命令简介xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令。因为以空格作为分隔符,所以有一些文件名或者其他意义的字符串内含有空格的时候,xargs可能会误判。简单来说,xargs的作用是给其他命令传递参数,是构建单行命令的重要组件之一。......
  • 在Linux/Ubuntu/Debian上安装TensorFlow 2.14.0
    在Ubuntu上安装TensorFlow2.14.0,可以遵循以下步骤。请注意,由于TensorFlow的版本更新可能很快,这里提供的具体步骤可能需要根据你的系统环境和实际情况进行微调。准备工作检查系统要求:确保你的Ubuntu系统满足TensorFlow的运行要求。TensorFlow支持Ubuntu16.04或更高版本......
  • linux 快速部署jar 并加入开机自启(超方便)
    第一步cd/etc/systemd/system/第二步创建app.service可以在本地创建好在传到/etc/systemd/system/目录下/usr/bin/java需要改成自己的java环境对应地址/srv/sites/app.jar改为自己jar存放包地址[Unit]Description=appserviceAfter=syslog.target[Service]Type......
  • 01Linux以及操作系统概述
    课程目标1.了解现代操作系统的整体构成及发展历史2.了解Linux操作系统及其分支版本3.直观上理解服务器端与桌面端版本的区别课程实验1.通过对CentOS和Ubuntu的演示,直观理解Linux与Windows的异同课堂引入本章内容主要为大家详细讲解Linux操作系统(以下简称Linux)的基本情......
  • linux 离线安装docker
    docker-ce下载地址很多情况下我们不能对docker进行在线安装,这时可以参照本篇博客尝试进行离线安装docker-ce1.下载对应版本的安装包2.解压安装包tar-zxvfdocker-XXX.tgz3.将解压的文件复制到指定位置cp./docker/*/usr/bin4.配置docker服务的文件如下cd/etc/syste......