事实是这样没错,但是这次的弹幕爬虫严格来讲紧张涉及到网络数据传输,并不须要布局html标签,直接用socket + mybatis要求到数据后存入数据库即可(我会说是python的多线程不熟习吗),实在也很方便,也不用去加脚本加py文件来实现。总而言之就两个字,大略。
由于头条的编辑器对付写代码不友好,因此我都用图片进行表示,须要源码的同学可以到文末的github链接高下载。
下载斗鱼协议文档斗鱼弹幕爬虫事理很大略:
客户端依次发送,上岸要求、加入房间要求、加入弹幕组要求。斗鱼的做事端返回弹幕
当然由于是一个长链接,还须要另起一个心跳线程(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。