锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

B_zhan直播间弹幕抓取

时间:2023-05-17 22:37:00 dd70f120三社二极管模块

前两天研究了一下B_zhan的直播间,其实B_zhan用户有用户。我最近几个月一直在做B站,几乎B_zhan能pa我试过所有的东西。它还包括私人信件和大量私人信件。然而,一再声明,哈,我学习是为了学习和技术,而不是为了商业目的。

在这里,我发出哔哩哔哩直播间弹幕的代码作为记录。以后用了就不用再写了。

import pymysql import requests,time  db = pymysql.connect("host", "root", "password", "table", charset='utf8mb4')  cur = db.cursor()  def work_1(room_id,f):     url = "aHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vQXBwUm9vbS9tc2c/cm9vbV9pZD0=" 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==; B_SESSDATA=987711b4,1660665085,8fe23*59; 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,1668516676,fa1f8*51; 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={"ffp":{"333.866.fp.risk_2E3F120D":"180D7DD8CB1","0.0.fp.risk_2E3F120D":"180D82148E1","333.130.fp.risk_2E3F120D":"180DC5DEA98","333.999.fp.risk_2E3F120D":"180DD67FD7C","888.2421.fp.risk_2E3F120D":"180D8383D38","777.5.0.0.fp.risk_2E3F120D":"180D8383D89","333.788.fp.risk_2E3F120D":"180E1E6BDB1","333.937.fp.risk_2E3F120D":"180E2135465","333.858.fp.risk_2E3F120D":"180DC610F9B","333.1007.fp.risk_2E3F120D":"180DCEDD446"}}; 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了一下。

aHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vQXBwUm9vbS9tc2c/cm9vbV9pZD0= room_id。

这是平台本身的界面,我们借用学习。

起初,我以为下图是直播间ID

直到后面我怎么看接口,怎么觉得接口没问题,那为什么每次拿下来的数据都一样,然后我又回去了F12中找到了,找到了正确的ID,数据被捕获是正常的。

正确的ID在下图中。

此外,我还将接口返回数据。有一个同学他不太懂。写完之后,我想和他分享这篇文章,让他看看。尽量详细写,让他看懂。

这里面我们主要是拿room中的数据,里面有我们想要的信息。

其实这里已经很简单了,text嘛,弹幕内容;nickname,昵称;还有timeline是用户发布时间;这里如果要看用户等级,在medal中的第一个元素中。 

为什么不用admin中的数据,感觉样式和room一模一样,但是多刷新两下你会发现admin中的数据像是类似于榜单这样的,所以造成刷新了两三次得到的数据一模一样。

另外额外说一个坑,就是B_zhan可能用户体量比较小,然后看直播的人也不多,发弹幕的少,刷新的时候,尤其是遇到观看人数少的那种,发现room中的数据一模一样,其实这不是接口原因,而是单纯的没人发弹幕。。。。。。。。所以我设置了5秒抓取一次,这个可以根据实际情况来定。既然发弹幕的人少,每次返回的数据中可能会有和上次重叠的,那怎么办?我是存在数据库中,以用户ID和时间两个字段为主键,因为它肯定不存在一个人同一时间发不了两个弹幕的情况,所以这样就完美的避开了这个坑。

OK,就这样吧,其实这个B_zhan项目还是很简单的,主要是给某位同学看下,要是我自己去写,我估计就直接贴个代码上去,其他的我就不管了。写完了,洗澡睡觉休息。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章