Python脚本如何在bilibili中查找弹幕发送者

总所周知bilibili是没有办法直接查看弹幕的发送者的,这使得当我们看到一些nt弹幕的时候虽然生气,却无可奈何,但是B站是可以屏蔽某个用户发送的弹幕的,这说明数据接口里肯定有用户信息,由于最近在学爬虫,所以我想先找找弹幕接口,分析下里面的数据。

找接口

找接口当然是随便打开一个视频然后F12啦,可是当我找了两圈后我傻眼了,没找到啊。。得,不能把时间浪费在这种事情上,果断打开百度,不出所料,找到了如下的两个接口,都是XML格式网页

https://comment.bilibili.com/+cid
https://api.bilibili.com/x/v1/dm/list.so?oid=+cid

这里面的cid是一种每个视频独有的数字,也就是每一P都有一个cid,查找cid可以打开网页然后F12,再ctrl+f搜索cid,一般八九位数的就是cid了。

这里我找到了一个接口,可以通过aid找到cid

https://www.bilibili.com/widget/getPageList?aid=+aid

分析数据

弹幕数据是获取到了,那么我们就要从这一堆数据中分析他们的用途了

这里大概能得到两个信息,其中第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的大小…)

做成网页供大家使用

接下来的操作似乎就水到渠成了,写了个python脚本,该python脚本接受2个参数,视频cid和想要搜索的弹幕关键字,返回用户发送的弹幕,用户的crc32b编码,时间戳。然后用php的exec函数执行python代码,并通过搜索数据库找出用户的uid,通过php返回json格式数据给前端。

python代码(写的很烂)

import requests
from bs4 import BeautifulSoup
import re
import io

import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
req = requests.get('https://comment.bilibili.com/'+sys.argv[1]+'.xml')
req.encoding = req.apparent_encoding
soup = BeautifulSoup(req.text, 'html.parser').find_all(name='d')
result = ""
for i in soup:
 s = re.sub('<(.*?)>', '', str(i))
 index = 0
 if(len(sys.argv[2])>0):
  index = s.find(str(sys.argv[2]))
 if(index!=-1):
  result+=str(i).split(",")[6]+","+s+","+str(i).split(",")[4]+","
print(result)

效果展示

前端代码就是随便写的~至少功能实现了嘛

这里说一下为什么是NULL,因为我的服务器还在可怜巴巴的往数据库内写入彩虹表数据。。预计需要4天~
       今天加了个暴力破解的功能,避免了查询结果为NULL,但是相对的查询速度会非常慢。

最后!附上该工具的链接:点我

总结

到此这篇关于Python脚本如何在bilibili中查找弹幕发送者的文章就介绍到这了,更多相关bilibili弹幕发送者内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • bilibili弹幕转ass程序制作思路及过程

    b站的弹幕,线下播放还是挺麻烦的,专用的弹幕播放器对其他格式的视频支持不好.我也试着弄个弹幕转字幕的小程序出来. 抓取xml文件的工作就不多说了,很简单的事,只要在播放页面看看源文件就能确定xml文件的地址进行抓取了. 本文主要是讲述xml内的弹幕转字幕的过程. 除去xml文件开头结尾的一些七七八八的东西,弹幕主体是这样的: <d p="51.593,5,25,16711680,1408852480,0,7fa769b4,576008622">怒求 up 自己配音!<

  • Python爬虫 bilibili视频弹幕提取过程详解

    两个重要点 1.获取弹幕的url是以 .xml 结尾 2.弹幕url的所需参数在视频url响应的 javascript 中 先看代码 import requests from lxml import etree import re # 使用手机UA headers = { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like

  • Python爬虫爬取Bilibili弹幕过程解析

    先来思考一个问题,B站一个视频的弹幕最多会有多少? 比较多的会有2000条吧,这么多数据,B站肯定是不会直接把弹幕和这个视频绑在一起的. 也就是说,有一个视频地址为https://www.bilibili.com/video/av67946325,你如果直接去requests.get这个地址,里面是不会有弹幕的,回想第一篇说到的携程异步加载数据的方式,B站的弹幕也一定是先加载当前视频的界面,然后再异步填充弹幕的. 接下来我们就可以打开火狐浏览器(平常可以火狐谷歌控制台都使用,因为谷歌里面因为插件

  • Python脚本如何在bilibili中查找弹幕发送者

    总所周知bilibili是没有办法直接查看弹幕的发送者的,这使得当我们看到一些nt弹幕的时候虽然生气,却无可奈何,但是B站是可以屏蔽某个用户发送的弹幕的,这说明数据接口里肯定有用户信息,由于最近在学爬虫,所以我想先找找弹幕接口,分析下里面的数据. 找接口 找接口当然是随便打开一个视频然后F12啦,可是当我找了两圈后我傻眼了,没找到啊..得,不能把时间浪费在这种事情上,果断打开百度,不出所料,找到了如下的两个接口,都是XML格式网页 https://comment.bilibili.com/+ci

  • Python实现在某个数组中查找一个值的算法示例

    第一种算法思路: 第一步:随机出来一个数组的下标 第二步:判断下标对应的值是否等于被查找的值,是的话终止,已找到,否的话转第三步. 第三步:判断是否随机完数组的所有下标,是的话终止,没找到,否的话转第一步. 代码如下: #本程序的功能是在字典中查找存在某个值 import random di = {'a':1,'b':2,'c':3,'d':4,'e':5,'f':6} key = 2 di1 = {} while True: tmp = random.choice(di.keys()) #随机

  • 如何在C# 中查找或结束程序域中的主、子进程

    有时候,我们的程序需要启动一些子进程,如嵌入的图形程序. 当启动一个进程后,获得这个进程信息Process,然后其内部在某个时刻启动了一个子进程,这个时候就涉及程序域和进程树的概念.当我们通过非正常操作的方式结束前面获得的进程信息Process时(如Kill掉),可能并没有实际结束子进程.因为当有主进程启动了子进程后,所有的进程实际上是被放在程序域中运行的(winform的Program文件中的Application域中),而结束的仅仅是域中的某个进程.当然,如果我们正常推出主进程,实际上App

  • 如何在 Linux 中查找一个命令或进程的执行时间

    在类 Unix 系统中,你可能知道一个命令或进程开始执行的时间,以及一个进程运行了多久. 但是,你如何知道这个命令或进程何时结束或者它完成运行所花费的总时长呢? 在类 Unix 系统中,这是非常容易的! 有一个专门为此设计的程序名叫 GNU time. 使用 time 程序,我们可以轻松地测量 Linux 操作系统中命令或程序的总执行时间. time 命令在大多数 Linux 发行版中都有预装,所以你不必去安装它. 在 Linux 中查找一个命令或进程的执行时间 要测量一个命令或程序的执行时间,

  • 使用IronPython把Python脚本集成到.NET程序中的教程

    从两个优秀的世界各取所需,更高效的复用代码.想想就醉了,.NET和python融合了."懒惰"的程序员们,还等什么? Jesse Smith为您展示如何两个语言来服务同一个.NET程序.你能集两家所长:Python和.NET一起工作,提供可重用的代码功能而不需要你为了一个环境重写代码库. 通过使用IronPython 运行时库,你可以让Python脚本运行在你的.NET程序中.本文向你展示如何使用一个.NET程序中的python脚本获取并展示用户反馈. 如果你曾经有在一个.NET程序中

  • centos 自动运行python脚本和配置 Python 定时任务

    目录 一.centos实现自动运行Python脚本 二.centos中测试定时任务 1.crontab文件 2.详细配置 3.设置定时任务 一.centos 实现自动运行 Python 脚本 正式配置前,先编写一段 Python 脚本,实现日志写入文件操作: import os import sys import logging current_path = os.getcwd() # 获取当前目录 logging.basicConfig(level=logging.INFO,        

  • 使用Python脚本在Linux下实现部分Bash Shell的教程

    对于Linux用户来说,命令行的名声相当的高.不像其他操作系统,命令行是一个可怕的命题,但是对于Linux社区中那些经验丰富的大牛,命令行却是最值得推荐鼓励使用的.通常,命令行对比图形用户界面,更能提供更优雅和更高效的解决方案. 命令行伴随着Linux社区的成长,UNIX shells,例如 bash和zsh,已经成长为一个强大的工具,也是UNIX shell的重要组成部分.使用bash和其他类似的shells,可以得到一些很有用的功能,例如,管道,文件名通配符和从文件中读取命令,也就是脚本.

  • 使用Python脚本对Linux服务器进行监控的教程

    目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido van Rossum 开发的.可免费获得的.

  • python实现在目录中查找指定文件的方法

    本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 复制代码 代码如下: import os from glob import glob #用到了这个模块 def search_file(pattern, search_path=os.environ['PATH'], pathsep=os.pathsep):     for path in search_path.split(os.pathsep):         for mat

  • python脚本实现mp4中的音频提取并保存在原目录

    一段把mp4中的音频提取为mp3并保存在原目录的python脚本 需要提前安装好ffmpeg 转换为单线程,耗时较长 github: https://github.com/cuifeiran/extract-mp3-from-mp4 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2020/2/26 17:36 # @Author : CuiFeiran # @FileName : tool.py # @Software : Py

随机推荐