翼度科技»论坛 编程开发 python 查看内容

python实现 获取b站主播直播间 粉丝牌信息

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
前言

用于实现通过牌子逆向查主播信息这个功能。
插件基于Nonebot2开发,链接:https://github.com/Ikaros-521/nonebot_plugin_searchBiliInfo
工程下载

github:https://github.com/Ikaros-521/get_bili_medal_list
gitee:https://gitee.com/ikaros-521/get_bili_medal_list
目录结构

data.py数据源自vtbs.moe
1.py用于获取数据
2.py用于中断时候的下标检索
data_medal.py用于存储用户结果数据
API

https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByUser?from=0&not_mock_enter_effect=1&room_id= 传入主播的房间号,解析json["data"]["medal"]["up_medal"]["medal_name"],即可。
使用

安装相应的第三方库(aiohttp)后,python 1.py 即可。
核心源码

1.py
  1. import json
  2. import asyncio
  3. import aiohttp
  4. import time
  5. from itertools import islice
  6. # data.py存储着从vtbs.moe获取的主播数据
  7. from data import DATA
  8. # data_medal.py用于存储获取的主播牌子信息
  9. from data_medal import DATA_MEDAL
  10. # 用于存储牌子数据
  11. data_medal_json = DATA_MEDAL
  12. # 请求头
  13. header1 = {
  14.     'content-type': 'text/plain; charset=utf-8',
  15.     # 下方填入你的cookie喵
  16.     'cookie': "",
  17.     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.186.400 QQBrowser/11.3.5195.400'
  18. }
  19. # 计数用
  20. num = 0
  21. # 获取主播牌子信息 传入主播房间号
  22. async def get_medal(roomid):
  23.     global header1
  24.     API_URL = 'https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByUser?from=0&not_mock_enter_effect=1&room_id=' + str(roomid)
  25.     async with aiohttp.ClientSession(headers=header1) as session:
  26.         try:
  27.             async with session.get(url=API_URL, headers=header1) as response:
  28.                 if response.status != 200:
  29.                     response.raise_for_status()
  30.                 ret = await response.json()
  31.         except aiohttp.ClientError as e:
  32.             print(e)
  33.             # 睡眠个3s
  34.             await asyncio.sleep(3)
  35.             # 重试一次
  36.             async with session.get(url=API_URL, headers=header1) as response:
  37.                 if response.status != 200:
  38.                     response.raise_for_status()
  39.                 ret = await response.json()
  40.             
  41.     return ret
  42. async def main():
  43.     global data_medal_json, num
  44.     # print(type(DATA))
  45.     # 遍历本地vtb数据 第二个参数的起始值,跳过前n个数据(这个下标可以通过2.py获取已加载到的下标)
  46.     for data in islice(DATA, 4849, None):
  47.         print(data)
  48.         try:
  49.             roomid = data["roomid"]
  50.         except (KeyError, TypeError, IndexError) as e:
  51.             print(e)
  52.             continue
  53.         if roomid == 0:
  54.             continue
  55.         # 睡眠个0.5s
  56.         await asyncio.sleep(0.5)
  57.         json1 = await get_medal(roomid)
  58.         # print(json1)
  59.         try:
  60.             if json1["code"] != 0:
  61.                 print(json1)
  62.                 continue
  63.             # 获取牌子名
  64.             medal_name = str(json1["data"]["medal"]["up_medal"]["medal_name"])
  65.             # 拼接新的json串
  66.             temp_json = { medal_name: data }
  67.             try:
  68.                 # 判断是否已经存在
  69.                 if temp_json in DATA_MEDAL:
  70.                     print("已存在 " + medal_name + " 跳过")
  71.                     continue
  72.                 else:
  73.                     # 追加入json
  74.                     data_medal_json.append(temp_json)
  75.             except (KeyError, TypeError, IndexError) as e:
  76.                 print(e)
  77.                 continue
  78.             # 计数+1
  79.             num += 1
  80.             print("获取牌子名:" + medal_name)
  81.             # 每获取10个结果 写入一次数据文件
  82.             if num % 10 == 0 and num != 0:
  83.                 filename = 'data_medal.py'
  84.                 with open(filename, 'w', encoding="utf-8") as file_object:
  85.                     file_object.write("DATA_MEDAL = " + json.dumps(data_medal_json, ensure_ascii=False))
  86.                 file_object.close()
  87.                 print("num=" + str(num) + ", 写入" + filename)
  88.         except (KeyError, TypeError, IndexError) as e:
  89.             print(e)
  90.             continue
  91.     filename = 'data_medal.py'
  92.     with open(filename, 'w', encoding="utf-8") as file_object:
  93.         file_object.write("DATA_MEDAL = " + json.dumps(data_medal_json, ensure_ascii=False))
  94.     file_object.close()
  95.     print("num=" + str(num) + ", 写入" + filename)
  96.     print("数据爬取完毕了,收工回家~")
  97. if __name__ == "__main__":
  98.     asyncio.run(main())
复制代码
来源:https://www.cnblogs.com/ikaros-521/p/17083274.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具