使用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
0
投稿
猜你喜欢
- 打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开upload_tmp_
- 在SQL Server数据库中,有min server memory与max server memory两个内存选项。数据库管理员合理设置这
- 刚刚看了bootstrap的导航栏,发现有点弄混了,现在来整理一下;导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点。导航
- HTML文档与CSS的关联常见有4种方式:1.使用link标记<link rel="stylesheet"
- 一、卷积神经网络卷积神经网络(ConvolutionalNeuralNetwork,CNN)最初是为解决图像识别等问题设计的,CNN现在的应
- 作为临时测试用python命令来搭建web测试是最好不过的选择了;CD切换到当前目录只需要一句python命令就迅速搭建好了简单的web服务
- 使用python3创建多线程聊天室,供大家参考,具体内容如下import threading import socket#socketudp
- 缩进Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件,如果条件成立,则执行归属于if的一个代码块
- 查看表空间的名称及大小代码如下:SQL>select t.tablespace_name, round(sum(bytes/(1024
- < ?php if (!function_exists("T7FC56270E7A70FA81A5935B72EACBE29
- 利用Python OpenCV中的 cv.Resize(源,目标,变换方法)就可以实现变换为想要的尺寸了源文件:就不用说了目标:你可以对图像
- 使Web系统的开发与维护更加方便,从而有效的节省人力物力,受到了越来越多企业的青眯。 模板引擎是MVC模式建立过程的重要方法,开发者可以设计
- 这个技巧将教你如何用css做出漂亮的文本按钮,有活力的按钮将节省你很多制作图片的时间,也能让你一天的工作中成为一个快乐的人,让我们一起看看效
- 简单的说,组织体系指的就是组织信息的方式。看了一堆拗口的定义后,我根据自己的理解画了下面这个图:从上图看出,同样的图形元素由于采用了不同的组
- 在改进SQL Server 7.0系列所实现的安全机制的过程中,Microsoft建立了一种既灵活又强大的安全管理机制,它能够对用户访问SQ
- 从这节开始,将会给大家介绍几个ASP中的三大通用类,它贯穿于我所设计的三层架构中,是对ASP语法的扩展,可以提高很多细节处理上的效率,可以算
- python 如何实现Excel 的Vlookup功能1、Excel 中VLOOKUP具体步骤Excel 中的VLOOKUP使用说明采用下面
- 在pyplot模块中可以使用xlabel()和ylabel()函数设置x轴y轴的标签。这两个函数的使用方法非常相似。使用xlabel()设置
- 一、json_encode() 对变量进行JSON编码语法:json_encode($value[,$options=0])注意: 
- 前言编写条件分支代码是编码过程中不可或缺的一部分。如果用道路来做比喻,现实世界中的代码从来都不是一条笔直的高速公路,而更像是由无数个岔路口组