python弹幕爬虫_Python爬虫弹幕采集的简单分析

前言

最近时间也是比较多,出于某些原因,对几个视频网站的弹幕进行了抓取。今天也是把手头的事情做完了,想着写一篇文章,也算对是一篇小小的总结。(要是有什么不对的地方,还请斧正)

正文

弹幕数据的格式根据网站视频种类的方式可能有所不同,这里大致分为两类:一种是存储在xml,json文件中的,此类比较容易。第二种是直播平台类的弹幕,由于弹幕具有实时性,存储在文件中不能满足其实时性,继而采用其他的方式,那具体是什么方式呢,先卖个关子。

第一种

对于这里的第一种情况,我们拿优酷来举例子。

首先,老规矩,带开网页,开发者选项,很乱,一堆请求......

SFK7`DIA$74}}~(]}@%J{`5.png

这里呢,有一个快捷的方式:先关闭弹幕,清空选项卡,再打开弹幕看请求。

USJARJDFQ6PZ3LME~Y.png

打开后立即能看到三个请求,是不是有点眼熟,让我们来看看其中的格式是json的选项卡。

59GM8QN9ZUY8FN7EGW`B.png

很明显,就是它了。

[email protected]

5(39KAWJ(DMGJG70{I~~3`T.png

我们看到,这个文件是通过post方式请求得到的。所有弹幕是分多个文件存储的,而其中决定返回某一文件的参数,经过测试,是由mat参数所决定的。

N`[email protected]

而其他的参数从何而来呢,又有何作用呢。经过测试,iid是某个电影的id,其他参数的值并不影响返回的结果,这里就不考虑进来了。那么问题来了,这个iid到哪儿获取呢,回到电影主页面的代码。搜索之前请求中的iid,果不其然,在这儿。

I%GT4S_AX.png

用正则表达式将其匹配出来,有了这些,请求的主要参数我们也就得到了。

#res.content为我们获得的主页内容

iid = re.findall("videoId:\"(.*?)\"", res.content)

第二种

这里采集的是一个直播网站(么么直播)

因为直播网站的弹幕具有实时性,这里采用的是websocket, 有些网站可能是采用的flash的socket通信,为什么要这样呢,因为需要实现浏览器与服务器的全双工通信,实现实时交互。

来自百度百科:WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。用于此的安全模型是Web浏览器常用的基于原始的安全模式。 协议包括一个开放的握手以及随后的TCP层上的消息帧。 该技术的目标是为基于浏览器的、需要和服务器进行双向通信的(服务器不能依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或和长轮询))应用程序提供一种通信机制。

说到web socket,这里又不得不讲到ajax轮询与long poll了:

ajax轮询的原理比较容易理解,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。

long poll 其实原理和 ajax轮询 相似,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

同样,看到选项卡:

NGY01P7.png

与普通http请求不同的是,我们可以看到选项卡中多了一个frame的选项,并且其中的内容是实时更新的,这就又说明了web socket的特性,全双工,就像我们打电话,我跟你说话的同时,你也能和我说话。

那么我们应该怎么模拟浏览器与服务器进行通信呢?这里只讲简单的实例,具体还请自行学习。

UYJI3%[email protected]

代码实现

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

总结

爬虫看似简单,其实水深着。对基础知识是一个不小的考验!

你可能感兴趣的:(python弹幕爬虫)