總所周知bilibili是沒有辦法直接檢視彈幕的傳送者的,這使得當我們看到一些nt彈幕的時候雖然生氣,卻無可奈何,但是b站是可以遮蔽某個使用者傳送的彈幕的,這說明資料介面裡肯定有使用者資訊,由於最近在學爬蟲,所以我想先找找彈幕介面,分析下裡面的資料。
這裡我找到了乙個介面,可以通過aid找到cid
已作廢)
新介面,引數可使用bvid)
彈幕資料是獲取到了,那麼我們就要從這一堆資料中分析他們的用途了
這裡大概能得到兩個資訊,其中第6個資料為時間戳,第8個資料為使用者uid的某種加密方式。經查詢得到這是使用者uid經過crc32校驗得到的結果轉為16進製制數,所以只能通過uid得到對於的校驗碼,無法反推。。似乎只能通過彩虹表的方式查詢資料了?那麼這串8位16進製制的數字在資料庫中要用什麼方式儲存呢?
選擇似乎有varchar和bigint,由於b站有差不多6億個使用者,在6億個資料中查詢想要的字串那速度必然很慢(但有人經測試得到varchar型資料和bigint型資料查詢速度其實差的不多?)
就在我決定用bigint儲存資料時,我突然想到,8位16進製制那就是2的32次方,int型的儲存上限時2的31次方,如果用無符號的方式儲存正好是2的32次方,也就是能儲存到0xffffffff這麼大的資料,正好滿足要求。於是果斷換成無符號int,與之對應的id也為無符號int,並將crc32b編碼過後的資料作為主鍵,製成彩虹表存入我的伺服器內。
(粗略的算了一下,6億資料就是需要27g左右的空間…而我的伺服器一共才40g的大小…)
import requests
from bs4 import beautifulsoup
import re
import io
import sys
buffer
,encoding=
'utf-8'
)req = requests.get(
''+sys.ar**[1]
+'.xml'
)soup = beautifulsoup(req.text,
'html.parser'
).find_all(name=
'd')
result =
""for i in soup:
s = re.sub(
'',''
,str
(i))
index =0if
(len
(sys.ar**[2]
)>0)
: index = s.find(
str(sys.ar**[2]
))if(index!=-1
):result+=
str(i)
.split(
",")[6
]+","+s+
","+
str(i)
.split(
",")[4
]+","print
(result)
前端**就是隨便寫的~至少功能實現了嘛
這裡說一下為什麼是null,因為我的伺服器還在可憐巴巴的往資料庫內寫入彩虹表資料。。預計需要4天~
今天加了個暴力破解的功能,避免了查詢結果為null,但是相對的查詢速度會非常慢。
歡迎來我的個人主頁玩~ yb的小屋
ionic如何在彈框寫HTML
首先我們先學習下如何跳 此方法中寫了幾個引數,則對應下面方法需要幾個引數,我們在html調取此方法 exitsystem 即可使用 exitsystem 此方法對應上面的引數 async presentalertexitsystem alertcontroller alertcontroller,m...
如何在linux中查詢檔案
find是最常見和最強大的查詢命令,你可以用它找到任何你想找的檔案。find 命令會在硬碟進行檢索,速度較慢。find 指定目錄 指定條件 指定動作 whereis命令只能用於可執行檔案的搜尋,只能查到一些特定檔案,而且whereis和locate執行機制一樣,也是從資料庫中查詢 var lib l...
如何在Solr中實現多core查詢?
size medium 基於solr或者elasticsearch提供的多核,多索引,多shard等查詢能力,一般都是由lucene提供的多索引查詢的功能演化而來的,這個功能在單機版的lucene裡面確實沒有發揮多大的威力,但是確是solrclourd,elasticsearch分布式集群查詢資料的...