我是个宅男,喜欢看很多人直播,以前可以看一天直播不出门。现在主要看这么些主播,虎牙的韦神、Dopa,斗鱼的狗贼嘘嘘。

对于其中的弹幕文化,非常感兴趣,就研究下,发现弹幕是用WebSocket实现的,那首先来说说什么是WebSocket。

WebSocket是什么

详细内容可以看看这个问题 https://www.zhihu.com/question/20215561

简单解释下:

HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。

这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

WebSocket的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。

WebSocket 如何工作

一个非常典型的WebSocket创建方式如下(来自某巨头):

function r() {    if (!d) {        var t = i();        I.info("%cconnecting " + t, p("#0000E3")),            u = new WebSocket(t),            u.onopen = n,            u.onclose = o,            u.onerror = a,            u.onmessage = h    }}

WebSocket获取龙珠直播弹幕

本次使用的Python第三方库是 https://github.com/websocket-client/websocket-client

看看官方例子:

import websockettry:    import threadexcept ImportError:    import _thread as threadimport time

def on_message(ws, message):    print(message)

def on_error(ws, error):    print(error)

def on_close(ws):    print("### closed ###")

def on_open(ws):    def run(*args):        for i in range(3):            time.sleep(1)            ws.send("Hello %d" % i)        time.sleep(1)        ws.close()        print("thread terminating...")    thread.start_new_thread(run, ())

if __name__ == "__main__":    websocket.enableTrace(True)    ws = websocket.WebSocketApp("ws://echo.websocket.org/",                              on_message = on_message,                              on_error = on_error,                              on_close = on_close)    ws.on_open = on_open    ws.run_forever()

是不是非常熟悉,和上面讲到的一模一样,4种主要思想方法都是一致的,可以直接调用。

那么到了实践环节,本次选取的是龙珠直播,为啥不是虎牙、斗鱼呢?这个待会再说,我们打开龙珠某个直播间

在网络里面选择ws这一项,即可看到相关连接,而且这些消息是加密过的,别急,我们打开m站试试

这个时候传输的弹幕消息已经没有加密过,直接对比,看到了一条“哈哈哈”的消息,所以我们现在可以确定就是这个websocket连接在传输相关消息。

依葫芦画瓢,我们尝试用Python来连接

Curl:

curl 'wss://mbgows.plu.cn:8806/?room_id=2185&group=0' -H 'Pragma: no-cache' -H 'Origin: http://m.longzhu.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' -H 'Sec-WebSocket-Key: n72+EfLt2iSrQ0EswTZ+2A==' -H 'User-Agent: Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Mobile Safari/537.36' -H 'Upgrade: websocket' -H 'Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits' -H 'Cache-Control: no-cache' -H 'Cookie: pluguest=81D781D68480BE065D952CA699B38E6627B61756AEF57338B39053154850A9502BC7FD850F86922BDF3DBD7F774BFDE5CBC80838A34B8F26' -H 'Connection: Upgrade' -H 'Sec-WebSocket-Version: 13' --compressed

Python代码

#!/usr/bin/env python  # -*- coding: utf-8 -*-"""@author: zhangslob@file: longzhu_websocket.py @time: 2018/11/17@desc: simple websocket client to connect longzhu"""

import websockettry:    import threadexcept ImportError:    import _thread as threadimport time

def on_message(ws, message):    import json    try:        print(json.loads(message))    except:        print(message)

def on_error(ws, error):    print(error)

def on_close(ws):    print("### closed ###")

def on_open(ws):    pass    # def run(*args):    #     for i in range(3):    #         time.sleep(1)    #         ws.send("Hello %d" % i)    #     time.sleep(1)    #     ws.close()    #     print("thread terminating...")    # thread.start_new_thread(run, ())

headers = {    'Pragma': 'no-cache',    'Origin': 'http://m.longzhu.com',    'Accept-Encoding': 'gzip, deflate, br',    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',    # 'Sec-WebSocket-Key': 'n72+EfLt2iSrQ0EswTZ+2A==',    'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Mobile Safari/537.36',    'Upgrade': 'websocket',    'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',    'Cache-Control': 'no-cache',    'Connection': 'Upgrade',    'Sec-WebSocket-Version': '13',}

if __name__ == "__main__":    websocket.enableTrace(True)    ws = websocket.WebSocketApp("wss://mbgows.plu.cn:8806/?room_id=2185&group=0",                                on_message=on_message,                                on_error=on_error,                                on_close=on_close,                                header=headers)    ws.on_open = on_open    ws.run_forever()

你可以直接运行上面的代码,看看会有什么结果

龙珠直播这个有点奇怪,你根本不用去向服务器发送什么消息,服务器无脑给你推送弹幕,常见的是客户端需要先告诉服务器“我是谁”,然后服务器再推送消息给你,并且还有有心跳检测,“我”告诉服务器我还在看呢,你继续给我弹幕,看看虎牙和斗鱼。

图中绿色的是发送的消息,红色是接受的消息。像这种情况就需要自己去看js代码是如何处理消息的。斗鱼的话有公开自己的弹幕服务器第三方接入协议。

copy代码可以阅读原文

WebSocket爬虫之爬取龙珠弹幕相关推荐

  1. Python爬虫:爬取Bilibili弹幕过程示例代码

    这篇文章主要介绍了Python爬虫爬取Bilibili弹幕过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来思考一个问题,B站一个视频的弹 ...

  2. 如何去使用Python爬虫来爬取B站的弹幕数据?

    哔哩哔哩众所周知是弹幕的天堂,视频观看人数越多,弹幕也就越多.今天小千就来教大家如何去使用Python开发一个爬虫来爬取B站的弹幕数据. 1.弹幕哪里找? 平常我们在看视频时,弹幕是出现在视频上的.实 ...

  3. 菜鸟弟弟从零开始的爬取Bilibili弹幕的Python爬虫教程-哔哩哔哩 - ( ゜- ゜)つロ 干杯~

    从零开始的爬取Bilibili弹幕的Python爬虫教程 或许可以作为一个爬虫小白的练手的demo? 还是先看看什么是爬虫吧!(还有Bilibili! ) 网络爬虫: 网络爬虫(又称为网页蜘蛛,网络机 ...

  4. python爬取bilibili弹幕_Python爬虫爬取Bilibili弹幕过程解析

    先来思考一个问题,B站一个视频的弹幕最多会有多少? 比较多的会有2000条吧,这么多数据,B站肯定是不会直接把弹幕和这个视频绑在一起的. 也就是说,有一个视频地址为https://www.bilibi ...

  5. python爬斗鱼直播_Python爬虫:利用API实时爬取斗鱼弹幕

    原标题:Python爬虫:利用API实时爬取斗鱼弹幕 这些天一直想做一个斗鱼爬取弹幕,但是一直考试时间不够,而且这个斗鱼的api接口虽然开放了但是我在github上没有找到可以完美实现连接.我看了好多 ...

  6. python接收弹幕_Python爬虫自动化爬取b站实时弹幕实例方法

    最近央视新闻记者王冰冰以清除可爱和专业的新闻业务水平深受众多网友喜爱,b站也有很多up主剪辑了关于王冰冰的视频.我们都是知道b站是一个弹幕网站,那你知道如何爬取b站实时弹幕吗?本文以王冰冰视频弹幕为例 ...

  7. python获取虎牙弹幕_python爬取虎牙弹幕礼物数据

    python爬取虎牙弹幕礼物数据 查看官方文档 找到弹幕传输的方式 生成websocket对应的参数 第一步: 第二步: 调通websocket 建立链接 获取数据和保持心跳 附上完整代码 注: 查看 ...

  8. python爬取虎牙弹幕礼物数据

    python爬取虎牙弹幕礼物数据 查看官方文档 找到弹幕传输的方式 生成websocket对应的参数 第一步: 第二步: 调通websocket 建立链接 获取数据和保持心跳 附上完整代码 注: 查看 ...

  9. python爬虫图片-如何用Python来制作简单的爬虫,爬取到你想要的图片

    原标题:如何用Python来制作简单的爬虫,爬取到你想要的图片 在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我 ...

  10. python 爬虫之爬取大街网(思路)

    由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取.这里我将记录一下,本人爬取大街网的思路. 附:爬取得数据仅供自己分析所用,并未用作其它用途. 附:本篇适合有一定 爬虫基础 crawl ...

最新文章

  1. PowerShell 导入 SQL Server 的 PS 模块
  2. Digital Signage and Windows Embedded Standard 7
  3. 人工智能和神经科学之间有什么关系?诺奖得主这样说……
  4. USB启动盘制作的几种方式
  5. BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
  6. go调用ethereum_Go语言爱好者周刊:第 76 期 — 新年计划做了吗?
  7. python教程长城图案,Python编写万花尺图案实例
  8. Notepad++ 设置执行 lua 和 python
  9. MFC中OnDraw与OnPaint的区别
  10. halcon rectangle1_domain缩减图像域为矩形
  11. Java 8 stream forEach filter anyMatch
  12. iPhone8 和 X 买哪个?听我的
  13. Perl一行式:处理空白符号
  14. 2021年量子计算机奖,中兴通讯携手中国移动共获“2021年未来网络领先创新科技成果”奖...
  15. 数据库迁移Flyway
  16. 【深度学习】图像匹配Siamese网络实验记录
  17. PyTorch:tensor-数据处理
  18. 阿里旺旺在线图标,在线状态生成
  19. Win11打印机脱机了怎么重新连接?Win11打印机脱机的解决方法
  20. 11.3-11.4kmp专题训练

热门文章

  1. border缩写属性
  2. Android font-awesome 4.2 icons png(包含holo-light和holo-dark)
  3. ACM河南第八届省赛题
  4. 腾讯技术分享实录:游戏后台开发九问
  5. 账结法 表结法 两种财务会计处理方法
  6. 华为网络计算机登陆,华为路由器如何登录192.168.3.1入口设置界面
  7. 微信小程序获取用户绑定手机号
  8. 悟空CRM系统学习心得
  9. 阿里巴巴官方:明年今日马云将不再担任董事局主席
  10. 能搬砖的游戏有哪些,有哪些比较适合新手去做?