使用python tkinter开发一个爬取B站直播弹幕工具的实现代码

使用Python Tkinter开发一个爬取B站直播弹幕工具的实现代码可以分为以下步骤:

  1. 导入模块
import requests
import json
import re
import tkinter as tk
from tkinter import scrolledtext
import threading
import time
  1. 获取直播间id和弹幕服务器地址
def get_live_info(room_id):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    res = requests.get('https://api.live.bilibili.com/room/v1/Room/room_init?id=' + room_id, headers=headers)
    data = json.loads(res.text)
    room_id = str(data['data']['room_id'])
    server_url = re.findall(r'[^\x00-\xff]+', data['data']['base_url'])[0]
    post_url = 'https://' + server_url + ':443/sub'

    return room_id, post_url
  1. 连接到弹幕服务器
def connect(post_url, room_id):
    json_data = {"roomid":room_id, "protover":1, "platform":"web","clientver":"1.4.0"}
    res = requests.post(post_url, data=json.dumps(json_data).encode('utf-8'), headers={
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
        'Origin': 'https://live.bilibili.com'})
    s = res.content
    guid = str(s[0x10:0x14][::-1].hex())
    return s, guid
  1. 解析弹幕信息
def parse_dm_info(s):
    while s:
        # 得到消息的长度 header = 16, size = len(s) - header
        header = s[0:16]
        contentlength = int.from_bytes(header[0x00:0x04], byteorder='big')
        magic = header[0x04:0x08]
        op = int.from_bytes(header[0x08:0x0c], byteorder='little')
        sequence = int.from_bytes(header[0x0c:0x10], byteorder='little')
        # 如果不是这个magic 直接返回byte数组
        if magic != b'\x00\x00\x00\x10':
            return s
        # 如果消息长度小于整个消息长条 直接返回byte数组
        if len(s) < contentlength+16:
            return s

        body = s[0x10:contentlength+16]

        try:
            msg = body.decode('utf-8', errors='ignore')
        except UnicodeDecodeError as err:
            print(err)
        # 将每条消息解析成json格式
        dm_json = json.loads(msg, strict=False)
        msg_type = dm_json['cmd']
        data = dm_json['data']

        #根据返回cmd类型来分类处理data数据 
        #在这里可以对每种类型数据进行后续操作 
        if msg_type == 'DANMU_MSG':
            danmu_content = data[1]
            user_name = data[2][1]
            return_msg = user_name + ':“' + danmu_content + '”\n'
        elif msg_type == 'SYS_MSG':
            reason = data['msg']
            return_msg = '系统公告:' + reason + '\n'
        else:
            return_msg = ''

        s = s[contentlength+16:]
        return return_msg
  1. GUI设计与多线程爬取弹幕
class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.room_id = tk.StringVar()
        self.room_id.set('输入房间号')
        self.createWidgets()

    def createWidgets(self):
        self.room_id_entry = tk.Entry(self, textvariable=self.room_id, width=30)
        self.room_id_entry.grid(row=0, column=0)

        self.start_button = tk.Button(self, text='开始', command=self.start_crawl)
        self.start_button.grid(row=0, column=1)

        self.stop_button = tk.Button(self, text='停止', command=self.stop_crawl, state='disabled')
        self.stop_button.grid(row=0, column=2)

        self.scrolled_text = scrolledtext.ScrolledText(self, width=80, height=20)
        self.scrolled_text.grid(row=1, columnspan=3)

    def start_crawl(self):
        self.start_button.config(state='disabled')
        self.stop_button.config(state='normal')
        self.t = threading.Thread(target=self.crawl_dm)
        self.flag = True
        self.t.start()

    def stop_crawl(self):
        self.flag = False
        self.start_button.config(state='normal')
        self.stop_button.config(state='disabled')

    def crawl_dm(self):
        self.scrolled_text.insert(tk.END, "开始爬虫\n")
        room_id, post_url = get_live_info(self.room_id.get())
        s, guid = connect(post_url, room_id)
        while self.flag:
            try:
                s += requests.post(post_url, data=b'\x00\x10\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x01', headers={
                    'Content-Type': 'application/octet-stream',
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
                    'Origin': 'https://live.bilibili.com',
                    'Referer': 'https://live.bilibili.com/' + self.room_id.get(),
                    'Accept-Language': 'zh-CN,zh;q=0.9',
                    'Pragma': 'no-cache',
                    'Cache-Control': 'no-cache'
                }).content
                dm_msg = parse_dm_info(s)
                if dm_msg:
                    self.scrolled_text.insert(tk.END, dm_msg)
                    self.scrolled_text.see(tk.END)
                s = b''
            except Exception as e:
                print(e)

            time.sleep(0.2)

app = Application()
app.master.title('B站直播弹幕爬虫')
app.mainloop()

以上就是使用Python Tkinter开发一个爬取B站直播弹幕工具的完整攻略、示例代码和操作结果。使用这个弹幕爬虫,你可以轻松进行B站弹幕的采集和分析,得到更多有用的信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用python tkinter开发一个爬取B站直播弹幕工具的实现代码 - Python技术站

(0)
上一篇 2023年6月13日
下一篇 2023年6月13日

相关文章

  • Python生成可执行文件之PyInstaller库的使用方式

    Python生成可执行文件之PyInstaller库的使用方式 PyInstaller是什么 PyInstaller是Python应用程序的一个打包器。它能够把用Python写成的脚本和程序打包成一个可执行文件,供Windows,Linux,Mac OS X等操作系统使用。 使用步骤 使用PyInstaller打包步骤: 在cmd中使用pip install…

    python 2023年6月5日
    00
  • pip报错“OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/misc.py’”怎么处理?

    原因 “OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/misc.py'” 错误通常是以下原因引起的: 权限不足:如果您没有足够的权限来访问 pip 相关文件,则可能会出现此错误。 文件损坏:如果 pip 相关…

    python 2023年5月4日
    00
  • python函数中将变量名转换成字符串实例

    将Python函数中的变量名转换为字符串实例是比较常见的操作,一般使用内置函数str()或repr()就能完成。 下面是详细的步骤及示例说明: 步骤一:通过locals()或globals()获取函数内部的变量,返回一个字典类型的变量locals/globals_dict。 步骤二:遍历字典,将变量名加入到一个列表中。 步骤三:使用列表中的变量名构建变量的字…

    python 2023年6月5日
    00
  • 简述:我为什么选择Python而不是Matlab和R语言

    我为什么选择Python而不是Matlab和R语言 Python、Matlab和R语言都是常见的数据分析和科学计算工具,但我选择使用Python的原因有以下几点: 1. Python是一门通用语言 相较于Matlab和R语言,Python是一门更加通用的编程语言,不仅可以进行科学计算和数据分析,还可以用于网页开发、机器学习、深度学习等多个领域。Python具…

    python 2023年5月20日
    00
  • 在python中的socket模块使用代理实例

    在Python中,如果需要通过代理(proxy)访问网络资源,可以使用socket模块进行操作。下面是在Python中使用socket模块使用代理的完整攻略。 1. 安装socks模块 在Python中,使用代理可以通过第三方库soscks实现,在使用之前需要安装soscks模块。 安装方式: pip install pysocks 2. 导入所需的模块 使…

    python 2023年6月3日
    00
  • 移除切比雪夫多项式小拖尾系数的Python程序

    移除切比雪夫多项式小拖尾系数的过程,通常被称为切比雪夫多项式带通滤波。这个过程可以通过一系列的数学公式和操作完成。在Python中,我们可以用一些库和函数来实现这个过程。以下是一种比较完整的Python程序,它可以用来移除切比雪夫多项式小拖尾系数: 导入所需库 import scipy.signal as signalimport numpy as np 配…

    python-answer 2023年3月25日
    00
  • Python实现的简单排列组合算法示例

    Python实现的简单排列组合算法示例 排列组合是数学中的一个重要概念,也是计算机编程中常用的算法之一。Python中,可以使用递归或迭代的方式实现排列组合算法。下面是一个简单的排列组合算法示例,包含详细的讲解和示例说明。 排列组合算法的定义 排列组合是指从n个同元素中取出m个元素的所有可能情况。其中,如果取出的素有顺序,称为排列;如果取出的素没有顺序,称为…

    python 2023年5月13日
    00
  • Python列表删除元素del、pop()和remove()的区别小结

    Python列表删除元素del、pop()和remove()的区别小结 在Python中,列表是一种常见的数据类型,它允许我们存储多个值。在使用列表时,我们经常需要删除其中的元素。Python提供了三种方法来删除列表中的元素:del、pop()和remove()。本攻略将详细讲解这三种方法的区别。 del del是Python中的一个关键字,可以用来删除列表…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部