使用 Swoole 抓取弹幕用户的信息

By | 2017年7月8日 | 阅读:497 次

前言
上一篇文章已经配合开发者文档和抓包,分析清楚了客户端和斗鱼弹幕服务器的请求包规则,这篇就写一下怎么构造请求来抓取弹幕

注:完整代码在我的代码仓库:code.yinzige.com/wuYin/spider


  1. 获取弹幕服务器地址
  2. 构造客户端请求
  3. 发起请求

1. 获取弹幕服务器地址和端口

  • 斗鱼把弹幕服务器的 IP 和 端口用按 URL 编码后放在网页源码中,我们抓取网页源码后用正则匹配该节点即可取到数据;网页源码中采集到的数据如下:

  • 弹幕服务器信息采集

  • 采集效果


2. 构造客户端请求

想要客户端进入直播间获取弹幕,需要向弹幕服务器发送两次请求包:loginreq 和 joingroup;包的结构参考文档或自己抓包分析;

2.1 构造 loginreq 匿名登录请求包

loginreq 包就是匿名的登录包,模拟游客观看直播的请求过程;构造 loginreq 包:

2.2 构造 joingroup 加入弹幕服务器的请求包

在弹幕高峰期,斗鱼会把弹幕分流成组,分配在多台服务器上,避免弹幕服务器请求负载过高;用户请求时 joingroup 包内的参数 gid 能指定要加入的弹幕服务器,按照文档传递 -999 就能请求到所有弹幕;

2.3 打包要发送的请求

斗鱼接收的请求协议头如下,我们的 loginreq 和 joingroup 两个包都需要加上手动构造的协议头;

协议头构造函数:


3. 发起请求

斗鱼的弹幕走的是 flash socket,参考讨论 弹幕实现技术,可以使用 swoole 模拟客户端发起异步请求,获取数据;参考:Swoole Client


4. 接收弹幕数据并处理

4.1 将响应数据反序列化、解码

参考文档,斗鱼会将用户输入的 /@S 代替,@@A 代替来传输,所以获取到响应第一步就是重新替换;

4.2 接收数据

在 swoole client 的 receive 回调中接收弹幕数据,并按文档解析数据存储即可;

  • 采集效果:在 switch 中采集需要的数据即可;

  • 存储弹幕和礼物,以及发弹幕的用户在斗鱼的身份信息:


后记
抓取弹幕的过程并不难,关键是请求的构造和响应数据的解码,参考开源项目 github.com/brucezz/DouyuCrawler 和知乎的回复可以了解解码的细节,解码的函数我拿过来直接就用了,感谢开源的作者;

发表评论

电子邮件地址不会被公开。