您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python基于Tkinter开发一个爬取B站直播弹幕的工具

51自学网 2021-10-30 22:41:37
  python
这篇教程Python基于Tkinter开发一个爬取B站直播弹幕的工具写得很实用,希望能帮到您。

简介

使用Python Tkinter开发一个爬取B站直播弹幕的工具,启动后在弹窗中输入房间号即可,弹幕内容会保存在脚本文件同级目录下的.log扩展名的文件中

开发工具

  • python 3.7.9
  • pycharm 2019.3.5

实现代码

import threadingimport timeimport tkinter.simpledialog  # 使用Tkinter前需要先导入from tkinter import END, messageboximport 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,建立窗口windowwindow = 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地址:

https://github.com/jonssonyan/bilibli-danmu

以上就是Python Tkinter开发一个爬取B站直播弹幕的工具的详细内容,更多关于Python 爬取B站直播弹幕的资料请关注51zixue.net其它相关文章!


pygame实现井字棋之第一步绘制九宫格
pygame实现井字棋之第二步逻辑实现
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。