![904d4431bac29b658569c1113527bc1c.png](https://img-blog.csdnimg.cn/img_convert/904d4431bac29b658569c1113527bc1c.png)
在前面的文章中已经把前后端的框架搭好,本篇文章我们来写一下斗鱼弹幕爬虫的Java版。可能有人会说Python版本的爬虫到处都可以搜到,而且用Python的scrapy、beautifulsoup等库又快又方便,那么为什么我们还要用Java写爬虫呢?
事实是这样没错,但是这次的弹幕爬虫严格来讲主要涉及到网络数据传输,并不需要构造html标签,直接用socket + mybatis请求到数据后存入数据库即可(我会说是python的多线程不熟悉吗),其实也很方便,也不用去加脚本加py文件来实现。总而言之就两个字,简单。
下载斗鱼协议文档
斗鱼弹幕爬虫原理很简单:
- 客户端依次发送,登陆请求、加入房间请求、加入弹幕组请求。
- 斗鱼的服务端返回弹幕
当然由于是一个长链接,还需要另起一个心跳线程(heart thread)来不断发送alive消息,以保持连接。
Step1 下载协议文档
去斗鱼第三方开放平台下载两份文档:
- 《斗鱼第三方开放平台API文档v2.2》
- 《斗鱼弹幕服务器第三方接入协议v1.6.2》
Step2 了解协议
根据第三方接入协议所述,我们需要按照斗鱼消息协议格式向斗鱼的弹幕服务器发送请求。
发送消息
就像TCP的3次握手一样,首先由客户端发出第一次握手,我们需要先发出登陆请求,为了扩展,我们将所有请求都认为是msg,先写一个请求函数。
public static void sendRequest(Socket client, String msg){
try {
int msgLength = 4 + 4 + msg.length() + 1;
byte[] dataLength = intToBytes(msgLength);
byte[] dataHead = intToBytes(DyUtil.CODE); // CODE = 689
byte[] data = msg.getBytes(StandardCharsets.ISO_8859_1); // 指定String转byte的编码格式
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
byteArray.write(dataLength);
byteArray.write(dataLength);
byteArray.write(dataHead);
byteArray.write(data);
byteArray.write(0);
OutputStream out = client.getOutputStream();
out.write(byteArray.toByteArray());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
我们定义一个发送请求的函数,这里的client