经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
适用于linux的bilibiliB站直播间弹幕爬虫脚本
来源:cnblogs  作者:WangChangAn  时间:2024/5/31 19:41:12  对本文有异议

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

  1. # -*- coding:utf-8 -*-
  2. # 时间:2024/4/26
  3. # 原作者:猫先生的早茶
  4. # 二创:wc1945451904@163.com
  5. #!/usr/bin/python
  6. #"""
  7. # 获取bilibili直播间弹幕
  8. # 房间号从网页源代码中获取
  9. # 打开直播画面后,按ctrl+u 打开网页源代码,按ctrl+f 搜索 room_id
  10. # 搜到的"room_id":1016中,1016就是房间号
  11. # 获取不同房间的弹幕:修改代码第26行的roomid的值为对应的房间号roomid,或者通过公共设置处的变量来设置之
  12. # 先在直播间手动输入一条弹幕,再开启该脚本
  13. #"""
  14. # wc:使用python在命令行中启动脚本,需要提前安装request 包,conda install requests或者
  15. # pip install requests
  16. import requests;
  17. import time;
  18. #公共设置
  19. sleeptime = 3;#此处修改抓取间隔
  20. groomid = '12159402'#二创者的直播间id(^_^)
  21. if(groomid==''):
  22. print("未设置目标直播间id");
  23. return;
  24. #彩色转译
  25. RED = '\033[91m'
  26. GREEN = '\033[92m'
  27. YELLOW = '\033[93m'
  28. BLUE = '\033[94m'
  29. MAGENTA = '\033[95m'
  30. CYAN = '\033[96m'
  31. RESET = '\033[0m'
  32. class Danmu():
  33. def __init__(self):
  34. self.t = False;#保证第一次循环一定要获取弹幕,然后进入第二循环
  35. self.lastMsg = '';
  36. self.lastTime = '';
  37. self.lastNickname = '';
  38. # 弹幕url
  39. self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory';
  40. # 请求头
  41. self.headers = {
  42. 'Host':'api.live.bilibili.com',
  43. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
  44. }
  45. # 定义POST传递的参数
  46. self.data = {
  47. 'roomid':groomid,#!!!修改为roomId
  48. 'csrf_token':'',
  49. 'csrf':'',
  50. 'visit_id':'',
  51. }
  52. def get_danmu_once(self):
  53. # 第一次获取直播间弹幕,全部打印
  54. html = requests.post(url=self.url,headers=self.headers,data=self.data).json();
  55. #
  56. # 弹幕列表逐项提取
  57. #逻辑:先打印,再判断并修改self.t
  58. #如果弹幕很少,则会
  59. if self.t==False:
  60. for content in html['data']['room']:
  61. self.lastTime = content['timeline']
  62. self.lastNickname = content['nickname'];
  63. self.lastText = content['text'];
  64. print(f"{GREEN}{self.lastTime}{BLUE}{self.lastNickname}{RESET}"+'\t:'+self.lastText)
  65. #print('\t:'+self.lastText)
  66. #outmsg = self.lastTime+self.lastNickname+'\t:'+self.lastText;
  67. #print(outmsg);
  68. if(self.lastTime!=''):
  69. self.t = True;
  70. def get_danmu_circle(self):
  71. # 后续获取直播间弹幕,则不可靠地找到上次记录的最后一条弹幕,然后输出其(不含)后面的弹幕
  72. html = requests.post(url=self.url,headers=self.headers,data=self.data).json();
  73. count = 0;#开关
  74. # 弹幕列表逐项提取
  75. for content in html['data']['room']:
  76. # 整合[ 昵称+对话内容 ]输出
  77. if(count == 1):#此处为第一条新增弹幕,输出之
  78. self.lastTime = content['timeline']
  79. self.lastNickname = content['nickname'];
  80. self.lastText = content['text'];
  81. print(f"{GREEN}{self.lastTime}{BLUE}{self.lastNickname}{RESET}"+'\t:'+self.lastText)
  82. #outmsg = self.lastTime+self.lastNickname+'\t:'+self.lastText;
  83. #print(outmsg);
  84. # 判断新弹幕
  85. elif(self.lastTime>=content['timeline']
  86. and self.lastNickname==content['nickname']
  87. and self.lastText==content['text']):
  88. count = 1;#
  89. continue;
  90. # sum+=1;
  91. # print("==============sum == %d",sum);
  92. # 创建bDanmu实例
  93. bDanmu = Danmu();
  94. while bDanmu.t==False:#False表示爬虫的弹幕列表为空
  95. time.sleep(sleeptime);
  96. bDanmu.get_danmu_once();
  97. while True:
  98. # 每隔x秒就检查一下直播间弹幕
  99. time.sleep(sleeptime);
  100. # 获取弹幕
  101. bDanmu.get_danmu_circle();
  102. #原作者原文链接:https://blog.csdn.net/qq_43017750/article/details/107771744

原文链接:https://www.cnblogs.com/djwca/p/18225183

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号