使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
作者:阿壮Jonsson 发布时间:2021-06-02 19:15:06
标签:python,tkinter,直播,弹幕
项目地址
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 支持的常用选项
补充
执行完命令之后会在项目目录下多出dist文件夹,编译后的文件就在该文件夹下 pyinstaller 不可以跨平台编译,windows平台下只能编译成windows下的执行文件(.exe),同理mac linux也是一样
来源:https://segmentfault.com/a/1190000039183583


猜你喜欢
- 在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率更高。一.什么是推导式推导式是从一个或者多个迭
- 一、前期准备1、安装好python3,可以在anaconda中安装python3。2、一个合适的双目摄像头。3、一台可以运行Matlab的电
- MySQL字符集:cp1252 West European (latin1) ,解决乱码问题 使用虚拟主机空间上的phpmyadmin操作数
- 本例使用 QQ邮箱测试,需要打开 QQ邮箱的 smtp协议,获取授权码代码内容如下:#!/usr/bin/env python# _*_ c
- 本文实例讲述了jQuery+php简单实现全选删除的方法。分享给大家供大家参考,具体如下:<input type="chec
- 任务1、我的咖啡馆你做主元组coffee_name=('蓝山','卡布奇诺','拿铁',
- 在ASP中,除了ADODB、Scripting 等一些常用组件外,我们还可以用微软的ActiveX方法来轻松捕获哟: <%u
- 一、赋值不会开辟新的内存空间,只是复制了新对象的引用。所以当一个数据发生变化时,另外一个数据也会随之改变。二、浅拷贝创建新对象,其内容是对原
- 这篇文章主要介绍了通过实例简单了解Python中yield的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 安装数据可视化模块matplotlib:pip install matplotlib导入matplotlib模块下的pyplot1 折线图f
- Python来进行查询和替换一个文本字符串?可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, s
- 前言subprocess库提供了一个API创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准
- 说起来惭愧,总是犯一些小错误,纠结半天,这不应为一个分号的玩意折腾了好半天! 错误时在执行SQL语句的时候发出的,信息如下: Java代码
- vue异步更新源码中会有涉及事件循环、宏任务、微任务的概念,所以先了解一下这几个概念。一、事件循环、宏任务、微任务1.事件循环Event L
- REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具
- 导航标签彼此互斥、完全穷尽。导航标签其实就是一种文字表达形式,我们用标签来代表网站上的各种分类信息。比如“联系我们”这个标签,代表的内容通常
- Axios是一款网络前端请求框架,基本用法如下:1. Axios基本用法:const response = await Axios.crea
- 这一部分我们将探索 PyQt5 的事件和信号是如何在应用程序中实现的。Events事件所有的GUI应用程序都是事件驱动的。应用程序事件主要产
- 用python SSH模块登录,并在远程机执行shell命令(在CentOS 7 环境试验成功, Redhat 系列应该是兼容的。)先安装必
- 我最近花了一些时间在探索CPython,并且我想要在这里分享我的一些冒险经历。Allison Kaptur的excellent guide