使用Requests获取到乱码数据,如何进行解码?
问题
我用以下Python代码调用接口:
import time,requests ts = str(int(time.time())) s = requests.session() payload = {"email": "jacquelinehoffm.s0.51993@gmail.com","timestamp":ts} headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;Win64) AppleWebkit/536.36 (KHTML, like Gecko) Chrome/89.0.4189.82 Safari/537.16', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9', 'Origin': 'https://smailpro.com', 'Referer': 'https://smailpro.com/advanced', 'Content-Type': 'application/json' } r = s.post('https://smailpro.com/app/key',json=payload, headers=headers) print(r.text)
返回结果是乱码:
♥��^7⌂�3W►��↕�♂r��+G��"�B�7���@♀��fd{^◄��!�◄l4�↑dx2n‼Sda��bd���;L���E�♦����KG�⌂c�{↔�♫*�lӖޡ��n��l���b���k]��z[_�]|����f�ׯ�_�rs��ɭ-�↑yw��ͥ���J�♫6U���dZ?�W��Y'�M�`����=�T�♥�♀6��m1�~�♠����J�Ur��b��b→p�P��M�♫+�YC;▲ ♥��W5Uƹ�@r��9o��|
预期返回应该是JSON格式:{code:200,items:'eyJ0eXA....iOiJKV1',msg:'OK'}。
我已经尝试了以下方法,但都没效果:
- 查看
r.encoding返回utf-8; - 以utf-8编码写入文件仍为乱码,二进制写入报错;
- 使用base64解码报错;
- 尝试encode、decode操作及直接使用
r.content均无效。
请问该如何解码这些乱码数据?
解决方法
你的问题核心是服务器返回了压缩数据,但requests未正确自动解压。因为请求头里指定了Accept-Encoding: gzip, deflate, br,服务器会返回压缩后的内容,若解压逻辑失效,就会显示乱码。试试以下方案:
1. 移除请求头的压缩声明
直接删掉headers中的'Accept-Encoding': 'gzip, deflate, br',让服务器返回未压缩的明文数据:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;Win64) AppleWebkit/536.36 (KHTML, like Gecko) Chrome/89.0.4189.82 Safari/537.16', 'Accept-Language': 'en-US,en;q=0.9', 'Origin': 'https://smailpro.com', 'Referer': 'https://smailpro.com/advanced', 'Content-Type': 'application/json' }
2. 手动处理压缩响应
如果必须保留Accept-Encoding,可以根据响应头的压缩类型手动解压:
import gzip import zlib from brotli import decompress # 检查响应的压缩类型 content_encoding = r.headers.get('Content-Encoding') if content_encoding == 'gzip': raw_data = gzip.decompress(r.content) elif content_encoding == 'br': raw_data = decompress(r.content) elif content_encoding == 'deflate': raw_data = zlib.decompress(r.content) else: raw_data = r.content # 转成UTF-8字符串 print(raw_data.decode('utf-8'))
注意:使用brotli需要先安装依赖:pip install brotli
3. 重置session的解压配置
有时候session的自定义配置会干扰自动解压,可重置相关设置:
s = requests.session() # 移除可能冲突的编码设置 s.encoding = 'utf-8' # 强制启用默认解压逻辑 s.headers.pop('Accept-Encoding', None) s.headers.update({'Accept-Encoding': 'gzip, deflate'})
本质上乱码不是编码问题,而是数据处于压缩状态,优先解决压缩解压的问题即可。
内容的提问来源于stack exchange,提问作者Морфей
相关产品推荐
相关产品推荐

