校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Python基于Tkinter開發一個爬取B站直播彈幕的工具

Python基于Tkinter開發一個爬取B站直播彈幕的工具

熱門標簽:江蘇房產電銷機器人廠家 溫州旅游地圖標注 外呼不封號系統 悟空智電銷機器人6 幫人做地圖標注收費算詐騙嗎 蘇州電銷機器人十大排行榜 電信營業廳400電話申請 荊州云電銷機器人供應商 遼寧400電話辦理多少錢

簡介

使用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地址:

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

以上就是Python Tkinter開發一個爬取B站直播彈幕的工具的詳細內容,更多關于Python 爬取B站直播彈幕的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 用python制作個視頻下載器
  • python3寫爬取B站視頻彈幕功能
  • 寫一個Python腳本自動爬取Bilibili小視頻
  • Python編程實現下載器自動爬取采集B站彈幕示例

標簽:景德鎮 三沙 欽州 宿遷 濟南 喀什 黃山 臺灣

巨人網絡通訊聲明:本文標題《Python基于Tkinter開發一個爬取B站直播彈幕的工具》,本文關鍵詞  Python,基于,Tkinter,開發,一個,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python基于Tkinter開發一個爬取B站直播彈幕的工具》相關的同類信息!
  • 本頁收集關于Python基于Tkinter開發一個爬取B站直播彈幕的工具的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 宁化县| 北安市| 泰州市| 沧源| 炉霍县| 互助| 蚌埠市| 玉林市| 偃师市| 侯马市| 诏安县| 兴安盟| 若尔盖县| 凌云县| 绍兴市| 个旧市| 福安市| 庐江县| 达尔| 广宁县| 芦溪县| 凯里市| 丹东市| 金堂县| 玉树县| 南雄市| 信宜市| 文安县| 繁昌县| 安宁市| 木里| 客服| 商河县| 日喀则市| 洞头县| 宁海县| 合山市| 罗甸县| 遵义县| 桑植县| 隆子县|