前两天研究了一下B_zhan的直播间,其实B_zhan的用户体量很少。我最近几个月一直在搞B_zhan,几乎B_zhan能pa的都被我试过。其中还包括包括私信,大批量的私信。不过再三声明哈,我本人是为了学习,为了技术而去研究,并非用于商业用途。
这里我把B站直播间弹幕的代码发出来,就当作做个记录吧,万一以后用到就不用我重新去写了。
import pymysql
import requests,time
db = pymysql.connect("host", "root", "password", "table", charset='utf8mb4')
cur = db.cursor()
def work_1(room_id,f):
url = "脱敏处理"+str(room_id)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
# 'Cookie': 'buvid3=DA5846C7-646E-0904-0458-012E677A9B3A55357infoc; innersign=1'
# 'cookie': '_uuid=B6610A168-E31D-5FE2-F6AA-6CBF474BD8F548855infoc; buvid3=2E3F120D-4845-237F-10E5-E098A837497F62582infoc; b_nut=1652889062; buvid4=20BD8A06-CE2E-4E53-7154-8708F50D709962582-022051823-9aP+lNBWQG3ZSvnKpWr+YXGoWltZK/meRYpL5S9DSBIfa9D7j0ATkg%3D%3D; B_SESSDATA=987711b4%2C1660665085%2C8fe23%2A59; bili_b_jct=2986eebd355f09bf706a9d8d59004920; B_DedeUserID=12717125; B_DedeUserID__ckMd5=ac85c1bd5132323c; B_sid=8znagbm4; buvid_fp_plain=undefined; CURRENT_BLACKGAP=0; blackside_state=0; rpdid=|(kmJY~k)|lR0J\'uYlkmYJm~J; fingerprint=2a02d0bcfbad3f8893500097c177b3e6; buvid_fp=f4d3163daaf209e5621bbe64b1e7330e; SESSDATA=9b054a26%2C1668516676%2Cfa1f8%2A51; bili_jct=c3a19d545ba134d1205c520b9819c39b; DedeUserID=23854230; DedeUserID__ckMd5=45af4dc91dbbc312; sid=6he4s3h6; bp_video_offset_489388000=635614817268269000; i-wanna-go-back=-1; b_ut=5; innersign=1; CURRENT_FNVAL=4048; bp_video_offset_23854230=662173756825796600; b_timer=%7B%22ffp%22%3A%7B%22333.866.fp.risk_2E3F120D%22%3A%22180D7DD8CB1%22%2C%220.0.fp.risk_2E3F120D%22%3A%22180D82148E1%22%2C%22333.130.fp.risk_2E3F120D%22%3A%22180DC5DEA98%22%2C%22333.999.fp.risk_2E3F120D%22%3A%22180DD67FD7C%22%2C%22888.2421.fp.risk_2E3F120D%22%3A%22180D8383D38%22%2C%22777.5.0.0.fp.risk_2E3F120D%22%3A%22180D8383D89%22%2C%22333.788.fp.risk_2E3F120D%22%3A%22180E1E6BDB1%22%2C%22333.937.fp.risk_2E3F120D%22%3A%22180E2135465%22%2C%22333.858.fp.risk_2E3F120D%22%3A%22180DC610F9B%22%2C%22333.1007.fp.risk_2E3F120D%22%3A%22180DCEDD446%22%7D%7D; PVID=4; b_lsid=EF104B5F9_180E5612158',
}
Session = requests.session()
while True:
proxies = IP()
try:
resp = Session.get(url=url,headers=headers,proxies=proxies)
content = resp.json()
except:
content["code"] == 0
if content["code"] == 0:
for i in content["data"]["room"]:
text = i["text"] #弹幕内容
timeline = i["timeline"] #弹幕发送时间
nickname = i["nickname"] # 弹幕发送者昵称
user_id = i["uid"] #弹幕发送者uid
if len(i["medal"]) == 0: # 弹幕发送者等级
medal = 0
else:
medal = i["medal"][0]
rnd = i["rnd"]
# f.write(nickname+"\t"+str(medal)+"\t"+str(timeline)+"\t"+text+"\n")
# print(nickname+"\t"+str(medal)+"\t"+str(timeline)+"\t"+text)
sql = f'INSERT INTO B_danmu (room_id,user_id,`name`,timeline,text,medal) VALUES (' \
f' "{room_id}","{user_id}","{nickname}","{timeline}","{text}","{medal}" )'
get_myql(sql, state="INSERT")
time.sleep(5)
def get_myql(sql,state):
if state == "select":
cur.execute(sql)
list = cur.fetchall()
return list
elif state == "INSERT":
try:
cur.execute(sql)
db.commit()
print(sql)
print("插入成功!!!")
except pymysql.err.IntegrityError:
pass
# print("重复")
def IP():
# 代理服务器
proxyHost = "************"
proxyPort = "9020"
# 代理隧道验证信息
proxyUser = "********"
proxyPass = "********"
proxyMeta = "************************" % {
"host": proxyHost,
"port": proxyPort,
"user": proxyUser,
"pass": proxyPass,
}
proxies = {
"http": proxyMeta,
"https": proxyMeta,
}
return proxies
if __name__ == '__main__':
t = str(int(time.time()))
room_id = "" #直播间的房间号
with open('直播间弹幕',"a",encoding="utf-8") as f:
work_1(room_id,f)
上面其实就用到了一个链接:
这里的URL转码了一下,base64了一下。
这是人家平台本身的接口,我们拿来借用学习。
起初我以为下图这里的是直播间ID
直到后面我怎么看接口怎么觉得接口没问题,那为啥拿下来的数据每次都一样,后面我就重新F12中找了找,找到了正确的ID,抓取下来的数据就正常了。
正确的ID是在下图这里。
另外,我把接口返回数据再说下,有个同学他不太懂,我等下写完要把文章分享过去让他看一下,尽量写的详细点,让他能看明白。
这里面我们主要是拿room中的数据,里面有我们想要的信息。
其实这里已经很简单了,text嘛,弹幕内容;nickname,昵称;还有timeline是用户发布时间;这里如果要看用户等级,在medal中的第一个元素中。
为什么不用admin中的数据,感觉样式和room一模一样,但是多刷新两下你会发现admin中的数据像是类似于榜单这样的,所以造成刷新了两三次得到的数据一模一样。
另外额外说一个坑,就是B_zhan可能用户体量比较小,然后看直播的人也不多,发弹幕的少,刷新的时候,尤其是遇到观看人数少的那种,发现room中的数据一模一样,其实这不是接口原因,而是单纯的没人发弹幕。。。。。。。。所以我设置了5秒抓取一次,这个可以根据实际情况来定。既然发弹幕的人少,每次返回的数据中可能会有和上次重叠的,那怎么办?我是存在数据库中,以用户ID和时间两个字段为主键,因为它肯定不存在一个人同一时间发不了两个弹幕的情况,所以这样就完美的避开了这个坑。
OK,就这样吧,其实这个B_zhan项目还是很简单的,主要是给某位同学看下,要是我自己去写,我估计就直接贴个代码上去,其他的我就不管了。写完了,洗澡睡觉休息。