前言
最近时间也是比较多,出于某些原因,对几个视频网站的弹幕进行了抓取。今天也是把手头的事情做完了,想着写一篇文章,也算对是一篇小小的总结。(要是有什么不对的地方,还请斧正)
正文
弹幕数据的格式根据网站视频种类的方式可能有所不同,这里大致分为两类:一种是存储在xml,json文件中的,此类比较容易。第二种是直播平台类的弹幕,由于弹幕具有实时性,存储在文件中不能满足其实时性,继而采用其他的方式,那具体是什么方式呢,先卖个关子。
第一种
对于这里的第一种情况,我们拿优酷来举例子。
首先,老规矩,带开网页,开发者选项,很乱,一堆请求......
这里呢,有一个快捷的方式:先关闭弹幕,清空选项卡,再打开弹幕看请求。
打开后立即能看到三个请求,是不是有点眼熟,让我们来看看其中的格式是json的选项卡。
很明显,就是它了。
我们看到,这个文件是通过post方式请求得到的。所有弹幕是分多个文件存储的,而其中决定返回某一文件的参数,经过测试,是由mat参数所决定的。
而其他的参数从何而来呢,又有何作用呢。经过测试,iid是某个电影的id,其他参数的值并不影响返回的结果,这里就不考虑进来了。那么问题来了,这个iid到哪儿获取呢,回到电影主页面的代码。搜索之前请求中的iid,果不其然,在这儿。
用正则表达式将其匹配出来,有了这些,请求的主要参数我们也就得到了。
#res.content为我们获得的主页内容
iid = re.findall("videoId:\"(.*?)\"", res.content)
第二种
这里采集的是一个直播网站(么么直播)
因为直播网站的弹幕具有实时性,这里采用的是websocket, 有些网站可能是采用的flash的socket通信,为什么要这样呢,因为需要实现浏览器与服务器的全双工通信,实现实时交互。
来自百度百科:WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。用于此的安全模型是Web浏览器常用的基于原始的安全模式。 协议包括一个开放的握手以及随后的TCP层上的消息帧。 该技术的目标是为基于浏览器的、需要和服务器进行双向通信的(服务器不能依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或<iframe>和长轮询))应用程序提供一种通信机制。
说到web socket,这里又不得不讲到ajax轮询与long poll了:
ajax轮询的原理比较容易理解,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
long poll 其实原理和 ajax轮询 相似,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
同样,看到选项卡:
与普通http请求不同的是,我们可以看到选项卡中多了一个frame的选项,并且其中的内容是实时更新的,这就又说明了web socket的特性,全双工,就像我们打电话,我跟你说话的同时,你也能和我说话。
那么我们应该怎么模拟浏览器与服务器进行通信呢?这里只讲简单的实例,具体还请自行学习。
代码实现
import websocket
import re
while True:
try:
ws = websocket.WebSocket()
ws.connect('ws://ws.memeyule.com:6010/socket.io/?room_id=51293043&access_token=&EIO=3&transport=websocket')
while True:
data = ws.recv()
JsonData = re.sub('[0-9]+', '', data, 1)
print JsonData.replace('[','').replace(']', '')
except:
continue
总结
爬虫看似简单,其实水深着。对基础知识是一个不小的考验!