程序解码错误-由python的requests.post 请求结果乱码引起的思考

简介: 最近,在使用python的requests.post的时候,不论结果如何处理,得到的都是乱码。乱码的原因是什么?Accept-Encoding和Content-Encoding的本质是什么?

最近,在使用python的requests.post的时候,不论结果如何处理,得到的都是乱码。代码如下:

import requests

headers = {
    "Accept-Encoding": "gzip, deflate, br",
}
param = '{"name":"tom"}'
resp = requests.post(url=url, data=param,headers=headers)
print(resp.content)
print(resp.text)

结果如图:

<\xe3\x80\xe13\x0c\xe5\xceS\xffL\xcd\xc5\x91\xe2V\xe5\xd1\x8d\x81\xfa\x00a\xb8\x0e7\xd2\xa5\xcbG\xf3@\xb1\x8d\xf4~\xcf\xad\xa3\x8c\x02\xea\xc1\xcdY\xe4p\xb39\xb9\xc1\xdb\xd7}\xa3\x02\x13\xa2\x84}"\xda\xcb\xd6\x8a\xba\xf4\x0c\xf6\xc4\xab\x18\x98\xadPg\xdc\xbd\xf3Wp\xa3\xb3pP\x91}y2\xe3\xf4U\x1b&\xd2u\xe3uW\xc4w\x1dL0\xd1\x97\xff\xd5N\xf1d\x87\xb7:\x9b=\xf0\r\x15\xceM\xf0)G\xee\xf9\xad\x15\xed\xfc\xbd\xca@\xadON\xdc\x14\xefyH\xa3KU\x87\xaf5#1\xf4\xff\xe3iE\xb7\xeat\xc5Lc\x8e\x0f`\x83\xbd\xe1\xec\xb8\xb1\x9b\xfa\x04A\xdf_\x88+\xe5A\xf2\xdbOmH;\xe0\xa3:\xac\xf9\xab\xc9`\x19\xbe\x92i;
�7� b0���������S0Yw�#"f�k���y�\ԓ�7�X����)u�!z�7��h�Ⱥ�1ޡ b0����4�J�w�th|b&�ɺ7"f�.�70�v�����E�"PB(�a27�ɘ��a��b21&��a

网上很多文章都说是编码的问题,比如修改编码:

resp.encoding='utf-8'
print(resp.text)
或者
print(resp.content.decode(encoding="utf-8"))  

然而,问题依旧!!!!!

这时候,查看一下response返回结果的header信息

print(resp.headers)

看到的header信息如下:

{
'Date': 'Tue, 05 Feb 2023 12:31:52 GMT', 
'Content-Type': 'application/json; charset=UTF-8', 
'Transfer-Encoding': 'chunked', 
'Connection': 'keep-alive', 'Vary': 'Accept-Encoding',
 'Content-Encoding': 'br'
 }

里面的{'Content-Encoding': 'br'} 这个引起了我的注意。于是就查了一下br是个什么东东??原来“br”是一种新的压缩算法,全称是Brotli。
我想,会不会是因为客户端不支持“br"这种算法导致的乱码呢?
于是,把requests.post的header修改了一下,把里面"br"算法删除,改为

headers = {
    "Accept-Encoding": "gzip, deflate",
}

然后再次运行,运行结果非常非常正常!果然是因为这个“br"算法导致的问题

问题原因

痛定思痛,捋一下思路,问题本身出在Content-Encoding与Accept-Encoding这2个header配置上面。

Content-Encoding与Accept-Encoding的说明

当设置压缩格式后,服务器会根据用户设置的压缩格式对页面进行压缩,节省http请求的流量。
 
当服务端接收到请求,并且从header里拿到编码标识时,就可以选择其中一种方式来进行编码压缩,然后返给客户端。当response的header里没有编码标识的话,客户端就不知道服务端是用的哪种方式压缩的,所以需要Content-Encoding来标识服务端压缩时所用的压缩方式。

简单的说:

  • Accept-Encoding:用来标识客户端能够理解的内容编码方式。
  • Content-Encoding:用来标识主体进行了何种方式的内容编码转换。
Accept-Encoding 是HTTP协议的请求报文头,一般形式如
"Accept-Encoding": "gzip, deflate, br"
其中:
  gzip
  deflate
  br    压缩算法 Brotli
Content-Encoding 是HTTP协议的响应报文头,一般形式如:
"Content-Encoding":"gzip,deflate,compress"
其中:
  gzip  表明实体采用GNU zip编码(使用最多)
  compress 表明实体采用Unix的文件压缩程序
  deflate 表明实体是用zlib的格式压缩的
  identity 表明没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况

到这里,问题就彻底明了了,因为Content-Encoding设置的是“br”算法,但是客户端不支持br算法,所以,导致了乱码的现象。

问题解决

  1. 简单的解决
    在请求的时候,把header的“br”算法删除掉
  2. 根本的解决
    如果非要保留br算法,python客户端应该怎么做呢?

python里有个“brotli”包,就是针对这个算法的

# 安装brotli
pip install Brotli

对response进行解码

import brotli
import requests

headers = {
    "Accept-Encoding": "gzip, deflate, br",
}
param = '{"name":"tom"}'
resp = requests.post(url=url, data=param,headers=headers)

resp = requests.post(url=url, data=param,headers=headers)
val = brotli.decompress(resp.content)
print(val)

大功告成!

相关文章
|
3月前
|
人工智能 Linux 开发工具
Python从零到一:手把手带你写出第一个实用程序
Python语法简洁易懂,适合编程新手入门。它广泛应用于人工智能、自动化办公、Web开发等领域。学习Python可快速搭建项目,拥有丰富库支持和强大社区资源。通过本教程,你将掌握基础语法、环境搭建、程序逻辑控制及实战项目开发,开启编程之旅。
378 0
|
7月前
|
数据采集 存储 开发者
如何动态调整Python爬虫的Request请求延迟
如何动态调整Python爬虫的Request请求延迟
286 13
|
2月前
|
设计模式 决策智能 Python
Python条件控制:让程序学会"思考"的魔法
本文深入浅出地讲解Python条件控制,从基础if语句到多分支、嵌套结构,再到简洁的三元表达式与Python 3.10新增的match-case模式匹配,结合电商折扣、会员等级、ATM系统等实战案例,全面掌握程序“智能决策”的核心逻辑。
398 0
|
2月前
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
3月前
|
JSON JavaScript API
Python模拟HTTP请求实现APP自动签到
Python模拟HTTP请求实现APP自动签到
|
6月前
|
人工智能 并行计算 开发者
CUDA重大更新:原生Python可直接编写高性能GPU程序
NVIDIA在2025年GTC大会上宣布CUDA并行计算平台正式支持原生Python编程,消除了Python开发者进入GPU加速领域的技术壁垒。这一突破通过重新设计CUDA开发模型,引入CUDA Core、cuPyNumeric、NVMath Python等核心组件,实现了Python与GPU加速的深度集成。开发者可直接用Python语法进行高性能并行计算,显著降低门槛,扩展CUDA生态,推动人工智能、科学计算等领域创新。此更新标志着CUDA向更包容的语言生态系统转型,未来还将支持Rust、Julia等语言。
493 3
CUDA重大更新:原生Python可直接编写高性能GPU程序
|
5月前
|
PyTorch 算法框架/工具 C++
人工智能算法python程序运行环境安装步骤整理
本教程详细介绍Python与AI开发环境的配置步骤,涵盖软件下载、VS2017安装、Anaconda配置、PyCharm设置及组件安装等内容,适用于Windows系统,助你快速搭建开发环境。
|
5月前
|
XML JSON 安全
分析参数顺序对Python requests库进行POST请求的影响。
最后,尽管理论上参数顺序对POST请求没影响,但编写代码时仍然建议遵循一定的顺序和规范,比如URL总是放在第一位,随后是data或json,最后是headers,这样可以提高代码的可读性和维护性。在处理复杂的请求时,一致的参数顺序有助于调试和团队协作。
191 9
|
5月前
|
机器学习/深度学习 前端开发 API
python3如何使用QT编写基础的对话框程序
Qt与Python结合形成了PyQt/PySide,为桌面应用开发提供强大支持。通过简单安装PyQt5或PySide6,开发者可快速搭建跨平台GUI应用。本文从创建基础对话框入手,介绍布局管理、信号与槽机制、对话框模式及样式表美化等核心功能,并探讨模态窗口、事件驱动编程和资源打包等内容。最后,引导读者探索模型视图架构、多线程处理等进阶技术,逐步掌握用Python+Qt开发高效桌面应用的技能。
189 0

推荐镜像

更多