Python3爬蟲 鬥魚彈幕爬蟲

2022-04-07 17:38:00 字數 3302 閱讀 4603

在網上找到了乙份鬥魚彈幕伺服器第三方接入協議v1.6.2,有了第三方介面,做起來就容易多了。

鬥魚後台協議頭設計如下:

這裡的訊息長度是我們傳送的資料部分的長度和頭部的長度之和,兩個訊息長度是一樣。然後要注意的是該協議使用的是小端整數,所以我們要對資料進行處理後再傳送,這裡可以使用int.to_bytes()將整數轉變成小端整數的形式。示例如下:

int.to_bytes(12,4,'little')   # b'\x0c\x00\x00\x00'

int.to_bytes(12,4,'big')     # b'\x00\x00\x00\x0c'

然後訊息型別是689(689表示客戶端傳送給伺服器,690表示伺服器傳送給客戶端),加密欄位和保留字段都是預設為0。這裡由於訊息型別是兩個位元組的,加密欄位和保留字段都是乙個位元組,但是因為加密欄位和保留字段都是0,所以這四個位元組可以使用int.to_bytes(689,4,'little')來表示。最後該協議使用的是utf-8編碼,所以我們需要對整個資料進行編碼後再傳送。

第三方客戶端通過 tcp 協議連線到彈幕伺服器(依據指定的 ip 和埠),其中ip 位址為openbarrage.douyutv.com,埠為8601,

client = socket.socket(socket.af_inet, socket.sock_stream)

host = socket.gethostbyname("openbarrage.douyutv.com")

port = 8601

client.connect((host, port))

客戶端向彈幕伺服器傳送登入請求,登入彈幕伺服器,格式如下:

type@=loginreq/roomid@=房間號/

客戶端收到登入成功訊息後傳送進入彈幕分組請求給彈幕伺服器,格式如下:

type@=joingroup/rid@=房間號/gid@=-9999/

gid表示分組號,第三方平台建議選擇-9999即海量彈幕模式。

接收伺服器傳送的廣播訊息,包括使用者發的彈幕和送的禮物資訊,然後解析得到具體的內容。

但這些資料裡只有禮物的id而沒有具體的禮物名稱,然後我通過抓包找到了兩個鏈結,裡面包含了禮物id和名稱的對應關係,相關**如下:

1 gift_dict ={}

2 headers =

5 url1 = "

"6 res1 = requests.get(url1, headers=headers)

7 js1 = json.loads(res1.text.lstrip('

dyconfigcallback(

').rstrip(');'

))8 gift_data1 = js1['

data

']['

flashconfig']

9 for i in

gift_data1.keys():

10 gift_dict[gift_data1[i]['

id']] = gift_data1[i]['

name']

1112 url2 = "

"13 res2 = requests.get(url2, headers=headers)

14 js2 = json.loads(res2.text.lstrip('

dyconfigcallback(

').rstrip(');'

))15 gift_data2 = js2['

data']

16for i in

gift_data2.keys():

17 gift_dict[int(i)] = gift_data2[i]['

name

']

客戶端每隔45秒給伺服器傳送一次心跳訊息,用於維護和伺服器後台間的聯絡,格式如下:

keep_msg = "type@=keeplive/tick@=十位時間戳"  # 舊版心跳訊息

keep_msg = "mrkl/" # 新版心跳訊息

在傳送資料的時候,有可能會出現一次無法傳送完的情況,所以就需要多傳送幾次,確保把資料都傳送出去:

1 msg = msg + '\0'

#資料以'\0'結尾

2 msg = msg.encode('

utf-8

') #

使用utf-8編碼

3 length = len(msg) + 8 #

訊息長度

4 code = 689 #

訊息型別5#

訊息頭部:訊息長度+訊息長度+訊息型別+加密字段(預設為0)+保留字段(預設為0)

6 head = int.to_bytes(length, 4, '

little

') + int.to_bytes(length, 4, '

little

') + int.to_bytes(code, 4, '

little')

7#傳送頭部部分

8client.send(head)9#

傳送資料部分

10 sent =0

11while sent

12 n = client.send(msg[sent:]) #

返回已傳送的資料長度

13 sent = sent + n

執行截圖:

進入資料庫檢視結果:

db.getcollection('douyu-6039226').find()

結果如下:

結果如下:

完整**已上傳到github!

python 爬蟲 b站彈幕爬蟲

coding utf 8 獲取bilibili直播間彈幕 房間號從網頁源 中獲取 開啟直播畫面後,按ctrl u 開啟網頁源 按ctrl f 搜尋 room id 搜到的 room id 1016中,1016就是房間號 獲取不 間的彈幕 修改 第26行的roomid的值為對應的房間號 import ...

python3 爬蟲入門

這裡爬取貓眼電影 top100 榜的資訊,作為學習的第乙個demo。今天開始接觸的python,從爬蟲開始。語言相對來說比較簡單,環境配置到是花了不少時間。有個要注意的點是在引入beautifursoup庫的時候會報錯,因為3.x的庫需要引入的是beautifursoup4.到這一步環境配置基本上o...

python3爬蟲入門

pip install requests2 匯入requests import requests 3 requests方法 requests.get 獲取html網頁的主要方法,對應http的get4 獲取流程 url 使用get方法獲取資料,返回包含網頁資料的response響應,超時時間測試 r...