计算机dbqh是几进制,为了抓取弹幕,你需要知道的一些二进制数据常识

为了抓取弹幕,你需要知道的一些二进制数据常识

c6c98ccb88a76b0d0cef4643f12d77e3.png

摄影:产品经理

春暖花开

文本不会讲具体某个网站的弹幕抓取方法。而是描述抓取到二进制的弹幕信息以后,如何进行处理。

不少直播网站会使用 websockets 来传输弹幕,当我们使用某种方式抓取到弹幕以后,你看到的弹幕可能是这样的:

b'\x00\x00\x00\x1a\x00\x10\x00\x01\x00\x00\x00\x08\x00\x00\x00\x01{"code":0}'

b'\x00\x00\x00\x14\x00\x10\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x19\xfd'

b'\x00\x00\x01\xed\x00\x10\x00\x02\x00\x00\x00\x05\x00\x00\x00\x00x\xda|R]k\xdc0\x10\xdc\\\xdd^\xdd|\x13\xe7g\xd7\xd7\x17_\xc4\xd7\xcf\x1f\xcfn.\xc4-\x01\x04Z\x06\t\xd5#X\rU^2\x04\xc1\x86\xce@\x05|.\x1b\xa2X\xc9gZ`\r\x08\xd4\xb8\x18\x0f\x15\x00\x82F\xaa\xfb;?\xceCToCpS\xc5S\x9eZ\xbcn\xf5\xd45k5\xf6

遇到这些二进制数据,如何把它解析为人眼能够看得懂的内容呢?

对于第一个bytes 型的数据,你可能会这样操作:

>>> data = b'\x00\x00\x00\x1a\x00\x10\x00\x01\x00\x00\x00\x08\x00\x00\x00\x01{"code":0}'

>>> data[16:]

b'{"code":0}'

>>> data[16:].decode()

'{"code":0}'

那第二条数据又应该怎么解析?第三条数据呢?第一条这个16是怎么来的呢?

为了解释这个问题,我们需要知道 Python 的struct 模块。这个模块可以使用Python的 bytes 型数据来表示 C 语言的结构体。

一般通过 websocket 传过来的弹幕,前面会有若干个字节作为头部数据,记录数据包的长度、头部长度、数据包的类型等等信息。

今天我们要作为例子的这个弹幕网站,它的弹幕头部格式如下:

I H H I I

包体长度 头部长度 包体数据类型 操作符 序列 id

这个头部对应的结构体为:

struct.Struct('>I2H2I')

其中,>表示这是一个大端序,二进制高位在左边。I表示无符号整型数字,占4个字节,H 表示无符号短整型,占用2个字节。2H是HH的简化写法,类似的还有3I表示III以此类推。

什么叫做大端序和小端序呢?这是由 CPU 架构决定的一种二进制数据储存方式。我们现在的 X86电脑,是小端序。

有一个数字7,它的二进制数据为111只占用3位。但是当我们使用整型的时候,一般会使用4字节,也就是32位二进制位。于是数字7会写为:00000000 00000000 00000000 00000111。其中最左边的8位是高位。最右边的8位是低位。这就是大端序。

但数字7在我们的电脑上,真正储存为00000111 00000000 00000000 00000000。最左边是低位,最右边是高位。这就是小端序。

我们可以用struct模块来测试一下:

>>> struct.pack('>I', 7)

b'\x00\x00\x00\x07'

>>> struct.pack('

b'\x07\x00\x00\x00'

这里返回的结果是十六进制,\x07表示十六进制的7.

看到这里,可能有同学会问,数字7本来用3位就能表示,为什么要搞个4字节32位?这不是浪费吗?

这是因为,当我们提前定义好数据的类型以后,就可以提前知道数据的长度。例如两个整型数100和67,他们各占用4字节,于是总长度是8字节。现在我把这两个数字都改了,改成3999和6785,两个数字都变大了。但是由于没有超过4字节能表示的最大范围,所以这两个数字占用的空间仍然是8字节。

回到我们开头说的弹幕网站。通过技术手段,我知道了它的头部有5个部分,分别用1个4直接无符号整数、两个无符号短整数、2个无符号整数表示。

所以我们可以提前构造头部的结构体,并知道头部的长度:

>>> head = struct.Struct('>I2H2I')

>>> head.size

16

那么,对于第一种情况,我们先截取头部,并把它还原为数字:

>>> data = b'\x00\x00\x00\x1a\x00\x10\x00\x01\x00\x00\x00\x08\x00\x00\x00\x01{"code":0}'

>>> header = head.unpack_from(data[:head.size])

>>> header

(26, 16, 1, 8, 1)

返回的元组中,第一个元素26表示包体长度为26个字节(包含头部),第三个元素1表示数据类型为未压缩的版本。所以我们直接获取数据的第16-26字节即可:

>>> data = b'\x00\x00\x00\x1a\x00\x10\x00\x01\x00\x00\x00\x08\x00\x00\x00\x01{"code":0}'

>>> data[16: 26]

b'{"code":0}'

同理。我们来看一下第二段数据:

>>> data = b'\x00\x00\x00\x14\x00\x10\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x19\xfd'

>>> header = head.unpack_from(data)

>>> header

(20, 16, 1, 3, 1)

>>> value_bytes = data[16: 20]

>>> value_bytes

b'\x00\x00\x19\xfd'

>>> int_value = int.from_bytes(value_bytes, 'big')

>>> int_value

6653

对头部解包以后,可以知道整个包体长度是20,那么获取第16到20字节的数据。这个数据是被转为 bytes 型数据的整数,所以需要把它重新转回int 型。由于数据是大端储存,所以代码需要写为int.from_bytes(value_bytes, 'big').

这里为什么我知道需要把这个数据转成整数呢?这是因为头部里面第4位数字3表示这条消息是当前视频的热度,就是一个数字。

第三段就留做作业给大家来解决了。给一个提示:解析出头部以后,你会发现头部的第3位对应数字2,表示后面的数据是经过压缩的。你可以使用 Python 的zlib。decompress(data[16: 数据包长度])对它进行解压缩。解压缩以后,你会惊讶地发现本文是用哪个网站的弹幕数据来进行举例。

kingname

攒钱给产品经理买房。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机,爬虫需要遵守网站的robots.txt协议,限访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值