最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基于Tkinter開發(fā)一個(gè)爬取B站直播彈幕的工具

 更新時(shí)間:2021年05月06日 16:27:53   作者:jonssonyan  
這篇文章主要介紹了Python Tkinter如何開發(fā)一個(gè)爬取B站直播彈幕的工具,幫助大家更好的利用python進(jìn)行圖形界面的開發(fā)學(xué)習(xí),感興趣的朋友可以了解下

簡(jiǎn)介

使用Python Tkinter開發(fā)一個(gè)爬取B站直播彈幕的工具,啟動(dòng)后在彈窗中輸入房間號(hào)即可,彈幕內(nèi)容會(huì)保存在腳本文件同級(jí)目錄下的.log擴(kuò)展名的文件中

開發(fā)工具

  • python 3.7.9
  • pycharm 2019.3.5

實(shí)現(xiàn)代碼

import threading
import time
import tkinter.simpledialog  # 使用Tkinter前需要先導(dǎo)入
from tkinter import END, messagebox

import requests

# 全局變量,用于標(biāo)識(shí)線程是否退出
is_exit = True


# B站獲取彈幕對(duì)象
class Danmu():
    def __init__(self, room_id):
        # 彈幕url
        self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory'
        # 請(qǐng)求頭
        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傳遞的參數(shù)
        self.data = {
            'roomid': room_id,
            'csrf_token': '',
            'csrf': '',
            'visit_id': '',
        }
        # 日志寫對(duì)象
        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']
            # 獲取發(fā)言
            text = content['text']
            # 獲取發(fā)言時(shí)間
            timeline = content['timeline']
            # 記錄發(fā)言
            msg = timeline + ' ' + nickname + ': ' + text
            # 判斷對(duì)應(yīng)消息是否存在于日志,如果和最后一條相同則打印并保存
            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 = ''


# 線程對(duì)象
def bilibili(room_id):
    # 創(chuàng)建bDanmu實(shí)例
    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():
    # 彈出對(duì)話框
    messagebox.showinfo(title='關(guān)于', message='作者:阿壯Jonson\n日期:2021年2月4日\n微信公眾號(hào):科技貓')


# 實(shí)例化object,建立窗口window
window = tkinter.Tk()
# 給窗口的可視化起名字
window.title('BiliBli彈幕查看工具')
# 設(shè)定窗口的大小(長(zhǎng) * 寬)
window.minsize(300, 500)
window.geometry('400x600+250+100')

# 菜單欄
menubar = tkinter.Menu(window)
# Open放在菜單欄中,就是裝入容器
menubar.add_command(label='關(guān)于', command=author)
# 創(chuàng)建菜單欄完成后,配置讓菜單欄menubar顯示出來
window.config(menu=menubar)

# 創(chuàng)建一個(gè)主frame,長(zhǎng)在主window窗口上
frame = tkinter.Frame(window)
frame.pack()

# 創(chuàng)建第二層框架frame,長(zhǎng)在主框架frame上面
# 上
frame_t = tkinter.Frame(frame)
# 下
frame_b = tkinter.Frame(frame)
frame_t.pack(side=tkinter.TOP)
frame_b.pack(side=tkinter.BOTTOM)

# 創(chuàng)建標(biāo)簽
tkinter.Label(frame_t, text='請(qǐng)輸入房間號(hào):', 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)


# 定義兩個(gè)觸發(fā)事件時(shí)的函數(shù)start_point和end_point(注意:因?yàn)镻ython的執(zhí)行順序是從上往下,所以函數(shù)一定要放在按鈕的上面)
# 開始
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
            # 創(chuàng)建獲取彈幕線程
            t.setDaemon(True)
            t.start()
    except ValueError:
        messagebox.showinfo(title='警告', message='輸入的房間號(hào)格式不正確,請(qǐng)?jiān)俅螄L試輸入!')


# 停止
def end_point():
    global is_exit
    is_exit = True
    e1.configure(state=tkinter.NORMAL)
    b1.configure(state=tkinter.NORMAL)
    b2.configure(state=tkinter.DISABLED)


# 創(chuàng)建并放置兩個(gè)按鈕分別觸發(fā)兩種情況
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)

# 滾動(dòng)條
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)
# 滾動(dòng)條動(dòng),列表跟著動(dòng)
sc.config(command=listb.yview)

# 主窗口循環(huán)顯示
window.mainloop()

爬取效果

Github地址:

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

以上就是Python Tkinter開發(fā)一個(gè)爬取B站直播彈幕的工具的詳細(xì)內(nèi)容,更多關(guān)于Python 爬取B站直播彈幕的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PyQt5使用pyqtgraph繪制波形圖

    PyQt5使用pyqtgraph繪制波形圖

    pyqtgraph是Python平臺(tái)上一種功能強(qiáng)大的2D/3D繪圖庫,相當(dāng)于matplotlib庫,比它更強(qiáng)大。本文就來利用pyqtgraph實(shí)現(xiàn)繪制波形圖,需要的可以參考一下
    2023-01-01
  • python數(shù)據(jù)庫編程 Mysql實(shí)現(xiàn)通訊錄

    python數(shù)據(jù)庫編程 Mysql實(shí)現(xiàn)通訊錄

    這篇文章主要為大家詳細(xì)介紹了python數(shù)據(jù)庫編程,Mysql實(shí)現(xiàn)通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python中的各種裝飾器解析

    Python中的各種裝飾器解析

    這篇文章主要介紹了Python中的各種裝飾器解析,Python裝飾器可以在不改變函數(shù)原實(shí)現(xiàn)方式的前提下,為函數(shù)添加額外的功能,需要的朋友可以參考下
    2023-11-11
  • python獲取系統(tǒng)內(nèi)存占用信息的實(shí)例方法

    python獲取系統(tǒng)內(nèi)存占用信息的實(shí)例方法

    在本篇文章里小編給大家整理的是關(guān)于python獲取系統(tǒng)內(nèi)存占用信息的實(shí)例方法,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-07-07
  • 【python】matplotlib動(dòng)態(tài)顯示詳解

    【python】matplotlib動(dòng)態(tài)顯示詳解

    這篇文章主要介紹了matplotlib動(dòng)態(tài)顯示,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境

    Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境

    這篇文章主要介紹了Jupyter notebook中如何添加Pytorch運(yùn)行環(huán)境,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用 Python 在京東上搶口罩的思路詳解

    使用 Python 在京東上搶口罩的思路詳解

    受疫情影響全民真的在搶口罩,而且還是搶不到的那種。這篇文章主要介紹了用 Python 在京東上搶口罩的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python如何使用正則表達(dá)式分割字符串舉4例說明

    Python如何使用正則表達(dá)式分割字符串舉4例說明

    在Python編程中我們經(jīng)常需要對(duì)字符串進(jìn)行分割操作,下面這篇文章主要給大家介紹了關(guān)于Python如何使用正則表達(dá)式分割字符串的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 基于Python實(shí)現(xiàn)一鍵批量查詢郵編

    基于Python實(shí)現(xiàn)一鍵批量查詢郵編

    這篇文章主要為大家詳細(xì)介紹了如何利用Python快速實(shí)現(xiàn)查詢excel表格里所有郵編對(duì)應(yīng)的地址信息,將輸出的省市縣信息分開放在不同的單元格中,感興趣的可以了解下
    2023-08-08
  • Python中l(wèi)ist列表的賦值方法及遇到問題處理

    Python中l(wèi)ist列表的賦值方法及遇到問題處理

    這篇文章主要介紹了Python中l(wèi)ist列表的賦值方法及遇到問題處理,記錄在列表list的賦值過程中遇到的問題,并對(duì)列表的拷貝相關(guān)知識(shí)進(jìn)行匯總,需要的朋友可以參考一下
    2022-03-03

最新評(píng)論

岗巴县| 金华市| 房山区| 修文县| 华宁县| 武汉市| 禄劝| 利辛县| 阿拉善左旗| 民县| 岫岩| 逊克县| 宁乡县| 蒙阴县| 青州市| 五大连池市| 宁安市| 宁南县| 阳高县| 涪陵区| 丰县| 兴山县| 吴桥县| 富阳市| 贵德县| 浦东新区| 荆州市| 渝中区| 张北县| 沽源县| 临城县| 龙海市| 黔江区| 垦利县| 荆门市| 温州市| 莱西市| 随州市| 天门市| 广宁县| 北辰区|