搜尋
首頁後端開發Python教學基於asyncio非同步協程框架實現收集B站直播彈幕詳細介紹

本文分享給大家的是基於asyncio 非同步協程框架實現收集B站直播彈幕收集系統的簡單設計,並附上源碼,有需要的小伙伴可以參考下

">

前言

雖然標題是全站,但目前只做了等級top 100 直播間的全天彈幕收集。

彈幕收集系統基於先前的B 站直播彈幕姬 Python 版修改而來。具體協議分析可以看上一篇文章。

直播彈幕協議是直接基於 TCP 協議,所以如果 B 站對類似我這種行為做反制措施,比較困難。應該有我不知道的技術手段來偵測類似我這種惡意行為。

我試過同時連接 100 個房間,和連接單一房間 100 次的實驗,都沒有問題。 >150 會被關閉連結。

直播間的選取

現在彈幕收集系統在選取直播間比較簡單,直接選取了等級 top100。

以後會修改這部分,改成定時去 http://live.bilibili.com/all 查看新開播的直播間,並動態新增任務。

非同步任務和彈幕儲存

收集系統仍舊使用了 asyncio 非同步協程框架,對於每個直播間都使用以下方法來加進 loop 中。

danmuji = bilibiliClient(url, self.lock, self.commentq, self.numq)
task1 = asyncio.ensure_future(danmuji.connectServer())
task2 = asyncio.ensure_future(danmuji.HeartbeatLoop())

其實若將心跳任務 HeartbeatLoop 放入 connectorServer 中去啟動,程式碼看起來更優雅一些。但這麼做是因為我需要維護一個任務列表,後面會有描述。

在彈幕儲存上我花了些時間選擇。

資料庫儲存是一個同步 IO 的過程,Insert 的時候會阻塞彈幕收集的任務。雖然有 aiomysql 這種非同步介面,但設定資料庫太麻煩,我的設想是這個小系統能夠方便地部署。

最終我選擇使用自備的 sqlite3。但 sqlite3 無法做並行操作,故開了一個執行緒單獨進行資料庫儲存。在另一個線程中,100 * 2 個任務蒐集所有的彈幕、人數信息,並塞進隊列 commentq, numq 中。儲存執行緒每隔 10s 喚醒一次,將佇列中的資料寫進 sqlite3 中,並清空佇列。

在多執行緒和非同步的配合下,網路流量沒有被阻塞。

可能的連線失敗場景處理

彈幕協定是直接基於TCP,位元與位元直接關聯性較強,一旦解析錯誤,很容易就拋Exception (個人感覺,雖然TCP 是可靠傳輸,但B站伺服器本身發生錯誤也是有可能的)。所以有必要設計一個自動重連機制。

在asyncio 文件中提到,

Done means either that a result / exception are available, or that the future was cancelled.

#函數
正常回傳、

拋出例外

或是被cancel,都會退出目前任務。可以用 done() 來判斷。 每一個直播間對應兩個任務,解析任務是最容易掛的,但並不會影響心跳任務,所以必須找出並將對應心跳任務結束。

在建立任務的時候使用字典記錄每個房間的兩個任務,

self.tasks[url] = [task1, task2]

在運行過程中,每隔10s 做一次檢查,

for url in self.tasks:
  item = self.tasks[url]
  task1 = item[0]
  task2 = item[1]
  if task1.done() == True or task2.done() == True:
    if task1.done() == False:
      task1.cancel()
    if task2.done() == False:
      task2.cancel()
    danmuji = bilibiliClient(url, self.lock, self.commentq, self.numq)
    task11 = asyncio.ensure_future(danmuji.connectServer())
    task22 = asyncio.ensure_future(danmuji.HeartbeatLoop())
    self.tasks[url] = [task11, task22]
實際上我只見過一次任務失敗的場景,是因為主播房間被封了,導致無法進入直播間。
  1. 結論

  2. B站人數是依照連接彈幕伺服器的連結數量統計的。透過操縱連結量,可以瞬間增加任意人數觀看,有商機? ############在運行的這幾天中,發現即使大部分房間不在直播,也能有 >5 的人數,包括凌晨。我只能猜測也有和我一樣的人在 24h 收集彈幕。 ###
  3. top100 平均一天 40M 彈幕數據。

  4. 收集的彈幕能做什麼?還沒想好,可能可以拿來做使用者行為分析 -_^

#

以上是基於asyncio非同步協程框架實現收集B站直播彈幕詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
列表和陣列之間的選擇如何影響涉及大型數據集的Python應用程序的整體性能?列表和陣列之間的選擇如何影響涉及大型數據集的Python應用程序的整體性能?May 03, 2025 am 12:11 AM

ForhandlinglargedatasetsinPython,useNumPyarraysforbetterperformance.1)NumPyarraysarememory-efficientandfasterfornumericaloperations.2)Avoidunnecessarytypeconversions.3)Leveragevectorizationforreducedtimecomplexity.4)Managememoryusagewithefficientdata

說明如何將內存分配給Python中的列表與數組。說明如何將內存分配給Python中的列表與數組。May 03, 2025 am 12:10 AM

Inpython,ListSusedynamicMemoryAllocationWithOver-Asalose,而alenumpyArraySallaySallocateFixedMemory.1)listssallocatemoremoremoremorythanneededinentientary上,respizeTized.2)numpyarsallaysallaysallocateAllocateAllocateAlcocateExactMemoryForements,OfferingPrediCtableSageButlessemageButlesseflextlessibility。

您如何在Python數組中指定元素的數據類型?您如何在Python數組中指定元素的數據類型?May 03, 2025 am 12:06 AM

Inpython,YouCansspecthedatatAtatatPeyFelemereModeRernSpant.1)Usenpynernrump.1)Usenpynyp.dloatp.dloatp.ploatm64,formor professisconsiscontrolatatypes。

什麼是Numpy,為什麼對於Python中的數值計算很重要?什麼是Numpy,為什麼對於Python中的數值計算很重要?May 03, 2025 am 12:03 AM

NumPyisessentialfornumericalcomputinginPythonduetoitsspeed,memoryefficiency,andcomprehensivemathematicalfunctions.1)It'sfastbecauseitperformsoperationsinC.2)NumPyarraysaremorememory-efficientthanPythonlists.3)Itoffersawiderangeofmathematicaloperation

討論'連續內存分配”的概念及其對數組的重要性。討論'連續內存分配”的概念及其對數組的重要性。May 03, 2025 am 12:01 AM

Contiguousmemoryallocationiscrucialforarraysbecauseitallowsforefficientandfastelementaccess.1)Itenablesconstanttimeaccess,O(1),duetodirectaddresscalculation.2)Itimprovescacheefficiencybyallowingmultipleelementfetchespercacheline.3)Itsimplifiesmemorym

您如何切成python列表?您如何切成python列表?May 02, 2025 am 12:14 AM

SlicingaPythonlistisdoneusingthesyntaxlist[start:stop:step].Here'showitworks:1)Startistheindexofthefirstelementtoinclude.2)Stopistheindexofthefirstelementtoexclude.3)Stepistheincrementbetweenelements.It'susefulforextractingportionsoflistsandcanuseneg

在Numpy陣列上可以執行哪些常見操作?在Numpy陣列上可以執行哪些常見操作?May 02, 2025 am 12:09 AM

numpyallowsforvariousoperationsonArrays:1)basicarithmeticlikeaddition,減法,乘法和division; 2)evationAperationssuchasmatrixmultiplication; 3)element-wiseOperations wiseOperationswithOutexpliitloops; 4)

Python的數據分析中如何使用陣列?Python的數據分析中如何使用陣列?May 02, 2025 am 12:09 AM

Arresinpython,尤其是Throughnumpyandpandas,weessentialFordataAnalysis,offeringSpeedAndeffied.1)NumpyArseNable efflaysenable efficefliceHandlingAtaSetSetSetSetSetSetSetSetSetSetSetsetSetSetSetSetsopplexoperationslikemovingaverages.2)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),