使用python tkinter开发一个爬取B站直播弹幕工具的实现代码


Posted in Python onFebruary 07, 2021

项目地址

https://github.com/jonssonyan...

开发工具 python 3.7.9

pycharm 2019.3.5 代码

import threading
import time
import tkinter.simpledialog
from tkinter import END, simpledialog, messagebox

import requests


class Danmu():
 def __init__(self, room_id):
  # 弹幕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': room_id,
   'csrf_token': '',
   'csrf': '',
   'visit_id': '',
  }
  # 日志写对象
  self.log_file_write = open('danmu.log', mode='a', encoding='utf-8')
  # 读取日志
  log_file_read = open('danmu.log', mode='r', encoding='utf-8')
  self.log = log_file_read.readlines()

 def get_danmu(self):
  # 暂停0.5防止cpu占用过高
  time.sleep(1)
  # 获取直播间弹幕
  html = requests.post(url=self.url, headers=self.headers, data=self.data).json()
  # 解析弹幕列表
  for content in html['data']['room']:
   # 获取昵称
   nickname = content['nickname']
   # 获取发言
   text = content['text']
   # 获取发言时间
   timeline = content['timeline']
   # 记录发言
   msg = timeline + ' ' + nickname + ': ' + text
   # 判断对应消息是否存在于日志,如果和最后一条相同则打印并保存
   if msg + '\n' not in self.log:
    # 打印消息
    listb.insert(END, msg)
    listb.see(END)
    # 保存日志
    self.log_file_write.write(msg + '\n')
    # 添加到日志列表
    self.log.append(msg + '\n')
   # 清空变量缓存
   nickname = ''
   text = ''
   timeline = ''
   msg = ''


def bilibili(delay, room_id):
 # 创建bDanmu实例
 bDanmu = Danmu(room_id)
 while True:
  # 暂停防止cpu占用过高
  time.sleep(delay)
  # 获取弹幕
  bDanmu.get_danmu()


def author():
 # 弹出对话框
 messagebox.showinfo(title='关于', message='作者:阿壮Jonson\n日期:2021年2月4日\n微信公众号:科技猫')


# tkinter GUI
window = tkinter.Tk()
window.title('BiliBli弹幕查看工具')
window.minsize(300, 500)
window.geometry('400x600+250+100')

# 菜单栏
menubar = tkinter.Menu(window)
# Open放在菜单栏中,就是装入容器
menubar.add_command(label='关于', command=author)
# 创建菜单栏完成后,配置让菜单栏menubar显示出来
window.config(menu=menubar)

# 滚动条
sc = tkinter.Scrollbar(window)
sc.pack(side=tkinter.RIGHT, fill=tkinter.Y)
# Listbox控件
listb = tkinter.Listbox(window, yscrollcommand=sc.set)
# 将部件放置到主窗口中
listb.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True)
# 滚动条动,列表跟着动
sc.config(command=listb.yview)

# 获取字符串(标题,提示,初始值)
room_id = simpledialog.askstring(title='请输入房间号', prompt='请输入房间号:'
         , initialvalue='21089733')
if room_id is not None:
 # 创建获取弹幕线程
 try:
  t = threading.Thread(target=bilibili, args=(0.5, str(room_id),))
  t.setDaemon(True)
  t.start()
 except:
  print("Error: 启动失败!请检查房间号是否正确")
# 进入循环显示
window.mainloop()

编译

使用第三方包:pyinstaller

命令

pyinstaller -F -w bilibli-danmu.py

参数解释

-F,-onefile 产生单个的可执行文件

-w,--windowed,--noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效) PyInstaller 支持的常用选项

使用python tkinter开发一个爬取B站直播弹幕工具的实现代码

补充

执行完命令之后会在项目目录下多出dist文件夹,编译后的文件就在该文件夹下 pyinstaller 不可以跨平台编译,windows平台下只能编译成windows下的执行文件(.exe),同理mac linux也是一样

到此这篇关于使用python tkinter开发一个爬取B站直播弹幕的工具的文章就介绍到这了,更多相关python tkinter开发B站直播弹幕工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
在pycharm中设置显示行数的方法
Jan 16 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
如何通过50行Python代码获取公众号全部文章
Jul 12 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
Aug 08 Python
pytorch梯度剪裁方式
Feb 04 Python
Python实现括号匹配方法详解
Feb 10 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
python实现经典排序算法的示例代码
Feb 07 #Python
Python自动化测试基础必备知识点总结
Feb 07 #Python
10张动图学会python循环与递归问题
Feb 06 #Python
PyCharm 光标变成黑块的解决方式
Feb 06 #Python
使用Python下载抖音各大V视频的思路详解
Feb 06 #Python
python wsgiref源码解析
Feb 06 #Python
Python 中的函数装饰器和闭包详解
Feb 06 #Python
You might like
PHP.MVC的模板标签系统(四)
2006/09/05 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
2018/10/29 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
python实现发送邮件及附件功能
2021/03/02 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
python如何查看网页代码
2020/06/07 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
一份Java笔试题
2012/02/21 面试题
毕业生求职简历的自我评价
2013/10/07 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
物业管理交接协议书
2016/03/24 职场文书
导游词之崇武古城
2019/10/07 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers