Python基于Tkinter开发一个爬取B站直播弹幕的工具
程序员文章站
2022-06-24 08:23:27
简介使用python tkinter开发一个爬取b站直播弹幕的工具,启动后在弹窗中输入房间号即可,弹幕内容会保存在脚本文件同级目录下的.log扩展名的文件中开发工具 python 3.7.9...
简介
使用python tkinter开发一个爬取b站直播弹幕的工具,启动后在弹窗中输入房间号即可,弹幕内容会保存在脚本文件同级目录下的.log扩展名的文件中
开发工具
- python 3.7.9
- pycharm 2019.3.5
实现代码
import threading import time import tkinter.simpledialog # 使用tkinter前需要先导入 from tkinter import end, messagebox import requests # 全局变量,用于标识线程是否退出 is_exit = true # b站获取弹幕对象 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(room_id): # 创建bdanmu实例 bdanmu = danmu(room_id) # 获取弹幕 bdanmu.get_danmu() class bilibilithread(threading.thread): def __init__(self, room_id=none): threading.thread.__init__(self) self.room_id = room_id # 重写run()方法 def run(self): global is_exit while not is_exit: print(self.room_id) bilibili(self.room_id) # 暂停防止cpu占用过高 time.sleep(0.5) def author(): # 弹出对话框 messagebox.showinfo(title='关于', message='作者:阿壮jonson\n日期:2021年2月4日\n微信公众号:科技猫') # 实例化object,建立窗口window 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) # 创建一个主frame,长在主window窗口上 frame = tkinter.frame(window) frame.pack() # 创建第二层框架frame,长在主框架frame上面 # 上 frame_t = tkinter.frame(frame) # 下 frame_b = tkinter.frame(frame) frame_t.pack(side=tkinter.top) frame_b.pack(side=tkinter.bottom) # 创建标签 tkinter.label(frame_t, text='请输入房间号:', width=10, font=('arial', 10)).pack(side=tkinter.left) # 显示成明文形式 default_text = tkinter.stringvar() default_text.set("21089733") e1 = tkinter.entry(frame_t, show=none, width=15, textvariable=default_text, font=('arial', 10)) e1.pack(side=tkinter.left) # 定义两个触发事件时的函数start_point和end_point(注意:因为python的执行顺序是从上往下,所以函数一定要放在按钮的上面) # 开始 def start_point(): try: room = e1.get() room_int = int(room) e1.configure(state=tkinter.disabled) b1.configure(state=tkinter.disabled) b2.configure(state=tkinter.normal) if room_int is not none: global is_exit is_exit = false t = bilibilithread() t.room_id = room_int # 创建获取弹幕线程 t.setdaemon(true) t.start() except valueerror: messagebox.showinfo(title='警告', message='输入的房间号格式不正确,请再次尝试输入!') # 停止 def end_point(): global is_exit is_exit = true e1.configure(state=tkinter.normal) b1.configure(state=tkinter.normal) b2.configure(state=tkinter.disabled) # 创建并放置两个按钮分别触发两种情况 b1 = tkinter.button(frame_t, text='开始', width=10, command=start_point, font=('arial', 10)) b1.pack(side=tkinter.left) b2 = tkinter.button(frame_t, text='停止', width=10, command=end_point, font=('arial', 10)) b2.pack(side=tkinter.left) # 滚动条 sc = tkinter.scrollbar(frame_b) sc.pack(side=tkinter.right, fill=tkinter.y) # listbox控件 listb = tkinter.listbox(frame_b, yscrollcommand=sc.set, width=200, height=120) # 将部件放置到主窗口中 listb.pack(side=tkinter.left, fill=tkinter.both, expand=true) # 滚动条动,列表跟着动 sc.config(command=listb.yview) # 主窗口循环显示 window.mainloop()
爬取效果
github地址:
以上就是python tkinter开发一个爬取b站直播弹幕的工具的详细内容,更多关于python 爬取b站直播弹幕的资料请关注其它相关文章!