最近写开发一个爬虫, 程序在本地好好的,返回的是正常的 html, 但是到了生产环境,不知道为什么返回的是一堆乱码
长这样:
查了好几天都没有进展, 对其进行各种转码均无效
今天终于找到解决办法了,感谢这个回答:
python 3.x - Unable to read json response from requests library - Stack Overflow
原来这种数据是经 Brotli 压缩后的数据,下面是文心一言给出的解释:
关于Brotli
Brotli是一种由Google开发的开源通用数据压缩算法,旨在优化网络上的数据传输。
以下是关于Brotli的详细概述:
- 背景与目的:
- 现代的网页通常包含大量的HTML、CSS和JavaScript代码以及图片、视频等大型文件数据,导致网页加载速度较慢。
- Brotli的设计目标是通过高效的压缩算法,减少网络传输的数据量,从而加快网页加载速度,提升用户体验。
- 技术特点:
- 压缩效率:相比传统的GZIP和DEFLATE算法,Brotli具有更高的压缩比,可以将数据压缩到更小的体积,节省带宽和存储空间。
- 编码技术:Brotli采用了多种先进的编码技术,包括霍夫曼编码(Huffman coding)、LZ77字典匹配以及自适应二进制长度编码(Adaptive Binary Length Coding),能够针对不同的输入数据动态调整压缩策略,实现最佳的压缩效果。
- 可配置性:Brotli的编码器库提供了12个质量级别(从0到11),允许在压缩速度和压缩率之间进行权衡。
- 跨平台支持:Brotli库支持多种操作系统和编程语言,包括C/C++、Python、Java等,方便开发者集成到各种项目中。
- 应用场景:
- Web性能优化:Brotli能够显著减少网络传输的数据量,加快页面加载速度,适用于HTTP/2多路复用和WebSocket传输等场景。
- 服务器资源节省:在存储有限的环境或带宽成本较高的情况下,Brotli可以帮助节省存储空间和带宽消耗。
- 实时通信:在实时通信应用(如视频会议)中,数据压缩可以降低延迟,改善用户交互体验。
- 兼容性:
- 尽管Brotli是一种新的压缩标准,但它已经在大多数现代浏览器中得到支持,确保了广泛的兼容性。
- 注意事项:
- Brotli压缩只在HTTPS下生效,因为HTTP请求中的
Accept-Encoding
头通常不包含br
(Brotli的缩写)。
- Brotli压缩只在HTTPS下生效,因为HTTP请求中的
综上所述,Brotli作为一种高效的压缩算法,为Web加速提供了有力的支持,是提升网络性能和用户体验的重要工具。
python Brotli 解压
在Python中,你可以使用brotli
库来解压Brotli压缩的数据。这个库提供了Brotli压缩和解压的API。如果你还没有安装这个库,你可以通过pip来安装它:
pip install brotli
一旦安装完成,你就可以在Python代码中使用这个库来解压Brotli数据了。下面是一个简单的例子:
import brotli
# 假设你有一个Brotli压缩的字节串
compressed_data = b'...' # 这里应该是你的Brotli压缩数据
# 使用brotli.decompress()函数来解压数据
decompressed_data = brotli.decompress(compressed_data)
# 现在decompressed_data包含了原始数据
print(decompressed_data)
在这个例子中,brotli.decompress()
函数接收一个字节串(bytes),该字节串应该包含Brotli压缩的数据。这个函数会返回一个字节串,该字节串包含了解压后的原始数据。
解压后, 终于显示正常数据了,谢天谢地谢广坤,终于解决了
同理,可能还会有其他压缩格式, 是根据 header 的 Accept-Encoding, 用上面的解压方式不行的话, 可尝试其他 Accept-Encoding 的其他解压方式
知识库又增加了一点点