You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,提问作者Морфей

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:10:13