关于python:使用python-tkinter开发一个爬取B站直播弹幕的工具

0次阅读

共计 2459 个字符,预计需要花费 7 分钟才能阅读完成。

我的项目地址

https://github.com/jonssonyan…

开发工具

  1. python 3.7.9
  2. 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 反对的罕用选项

补充

  1. 执行完命令之后会在我的项目目录下多出 dist 文件夹,编译后的文件就在该文件夹下
  2. pyinstaller 不能够跨平台编译,windows 平台下只能编译成 windows 下的执行文件 (.exe),同理 mac linux 也是一样
正文完
 0