使用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使用递归解决全排列数字示例
Feb 11 Python
Python with的用法
Aug 22 Python
详解在Python和IPython中使用Docker
Apr 28 Python
简单分析Python中用fork()函数生成的子进程
May 04 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
python获取本机所有IP地址的方法
Dec 26 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
Python依赖包整体迁移方法详解
Aug 15 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP7常量数组用法分析
2016/09/26 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
初步解析Python下的多进程编程
2015/04/28 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
本科生求职简历的自我评价
2013/10/21 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
幼儿园教师国培感言
2014/02/02 职场文书
幼儿园老师寄语
2014/04/03 职场文书
紫日观后感
2015/06/05 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android