事实是这样没错,但是这次的弹幕爬虫严格来讲紧张涉及到网络数据传输,并不须要布局html标签,直接用socket + mybatis要求到数据后存入数据库即可(我会说是python的多线程不熟习吗),实在也很方便,也不用去加脚本加py文件来实现。
总而言之就两个字,大略。

由于头条的编辑器对付写代码不友好,因此我都用图片进行表示,须要源码的同学可以到文末的github链接高下载。

下载斗鱼协议文档

斗鱼弹幕爬虫事理很大略:

phpmysql弹幕我用Java爬取了斗鱼刀塔区的弹幕 Docker

客户端依次发送,上岸要求、加入房间要求、加入弹幕组要求。
斗鱼的做事端返回弹幕

当然由于是一个长链接,还须要另起一个心跳线程(heart thread)来不断发送alive,以保持连接。

Step1 下载协议文档

去斗鱼第三方开放平台下载两份文档:

《斗鱼第三方开放平台API文档v2.2》《斗鱼弹幕做事器第三方接入协议v1.6.2》

斗鱼第三方地址:http://dev-bbs.douyutv.com/forum.php?mod=forumdisplay&fid=37

Step2 理解协议

根据第三方接入协议所述,我们须要按照斗鱼协议格式向斗鱼的弹幕做事器发送要求。

发送

就像TCP的3次握手一样,首先由客户端发出第一次握手,我们须要先发出上岸要求,为了扩展,我们将所有要求都认为是msg,先写一个要求函数。

我们定义一个发送要求的函数,这里的client便是我们的连接,msg便是我们详细的要求类型。
学过打算机网络的该当知道,两个网络节点之间的交互是通过套接字来进行的,而Java中的Socket类就可以被作为网络中的套接字,client将会通过以下办法进行初始化:

Socket client = new Sokcet(\"大众openbarrage.douyutv.com\"大众, \"大众8601\公众);

指定弹幕做事器与端口号。
在我的电脑上不知道为什么在要求openbarrage.douyutv.com时会报:Unknow Host。
因此我直策应用它的ip来初始化Socket。

我们在命令行ping一下openbarrage.douyutv.com,就可以看到它的ip地址:119.96.201.28

因此我采取的初始化办法为

Socket client = new Sokcet(\"大众119.96.201.28\"大众, \公众8601\"大众);

然后我们看如何布局斗鱼的要求头。

可以看到,该要求头一共是 4 字节的长度 + 8 字节的头部 + 数据部。
那么表格中的长度是多少呢?

长度 = 头部 + 数据部

这里将长度这个信息重复了两次,但是第一次不算在长度的打算之中,以是长度为 8 + 数据的长度 + 1(结尾的'\0')。
即9 + 数据长度。

我们须要将数据分5块,分别是4字节长度,4字节长度,4字节的类型+加密字段+保留字段,数据部和末了一字节的结尾符(0代表'\0'的字节形式),写入byte数组输出流中。

这些数据都须要转成字节形式,再看斗鱼协议,里面说斗鱼的格式都是小端模式(不像字符串有String.getBytes()函数,int得自己定义了)。
我们定义两个转换函数:

阐明一下这个函数,int是4字节32位的,将data右移24位后,左边补0,得到最左边的8位(位于最右边)。
此时通过与上0xFF,即与上0000 0000 0000 0000 0000 0000 1111 1111。
将左边24位都清0,留下右边8位,存在byte数组中。

接管

在接管时,先拿到返回的长度,以便不才面申请buffer的时候不须要申请多余的buffer,然后将几个无用数据(都是4字节)都读出来。

长度-8便是真正的数据返回长度。
通过循环读入,直到读入的数据长度即是斗鱼见告我们的长度为止。

爬虫线程

然后我们来写一个爬虫线程类。

首先发奉上岸要求与加入弹幕组要求:

然后在连接到斗鱼后,开始处理:

这里的处理函数并非像Python那样通过正则来取,而是:

将用'/'划分,然后另key为@=前面的值,value为@=后面的值。

心跳线程

主函数

创建一个主函数类后,直接用psmv一键天生public static void main。

以下是老陈和肚皮怪的弹幕:

当然,后续将会用线程池优化一下,事实上,上面的代码已经加入了springboot与mysql了。
想要源码的同学可以去github高下载:https://github.com/9plus/As/tree/master/demo/DyTest。