0.前言
前几天(寒假前咯)闲着无聊,看到舍友们都在看斗鱼TV,虽然我对那些网络游戏都不是非常感兴趣,但是我突然间想到,如果我可以获取上面的弹幕内容,不就有点意思了么?
1.分析阶段
如果我想要抓取网页上面的东西,无非就是两种方法
使用浏览器,手工(自己点击)或者非手工(使用JS脚本),存取我想要的东西。
编写HTTP客户端(斗鱼无HTTPS通讯)
第一种方法是万能的,但显然是不行的, 原因如下:
手动保存实在是不可行,程序员不为也。
浏览器与本地交互有限,换而言之,也就是即使我抓取了对应的弹幕,我也没有办法解决持久化的问题。
假设你选择的是Chrome或者firefox浏览器,也不是不能实现持久化,但这需要写扩展,Chrome扩展没有写过,也不是很感兴趣。
第二种方法显然是一个正常的程序员的做法。
语言选用Ruby
写一个客户端,也就是写一个小爬虫,使用的场景:
用户在终端执行命令
gem install danmudanmu douyu [room_id/url]#比如
danmu douyu qiuri
danmu douyu http://www.douyutv.com/13861
然后就可以在终端欣赏弹幕咯.
Screen Shot 2016-02-09 at 12.23.15 PM.png
回想一下抓取网站的方法
四步走:请求网页(原始数据) - 提取数据(提纯数据) - 保存数据 - 分析数据
很显然,只要解决了请求网页,其他的也就无非解析和SQL语句什么的。
1.1.斗鱼TV弹幕抓取的思路确定
如果是像我上面说的那么简单,也就不必再写一篇文章。毕竟,网页小爬虫没有什么技术含量。分布式爬虫才有。
通常情况下的网页小爬虫无非要解决如下问题:
请求,如果对方有一定策略的反爬虫,那需要反反爬虫。比如,
header带上host,带上refer,带上其他
需要验证,那就申请用户名和密码,然后登陆
如果在登录时期有防跨站机制,那就先获取一次登录页面,然后解析出token,带上对应的token然后登陆。
在程序中加入Log,并且存到本地。防止出现各种各样的反爬虫机制ban掉了程序,从而方便进行下一步防反爬虫对策。
并且,由于请求响应机制的存在,通常情况下,每一个请求对应一个响应,如果出错了,要么超时,要么有状态码,所以普通的web爬虫也相对而言比较容易些。
那么,斗鱼TV的站点是不是这样子的就能够容易爬取呢?
你猜到了,答案是“不是”。
由于弹幕具有实时性,就决定了斗鱼TV的弹幕无法通过保存完整指定时间端弹幕的XML(比如BILIBILI的一个视频弹幕是存在一段xml中的)或者Json数据来显示弹幕。要不然的话,那主播操作很出色的时候,观众的弹幕岂不是无法实时显示了么?
那么,肯定就是WebSocket了,于是,我一如既往的打开F12,查看网络流量。
正如你想到