程序解码错误-由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)

大功告成!

相关文章
|
13天前
|
存储 Shell 区块链
怎么把Python脚本打包成可执行程序?
该文档介绍了如何将Python脚本及其运行环境打包成EXE可执行文件,以便在不具备Python环境的计算机上运行。首先确保Python脚本能够正常运行,然后通过安装PyInstaller并使用`--onefile`参数将脚本打包成独立的EXE文件。此外,还提供了去除命令行窗口和指定可执行文件图标的详细方法。这些步骤帮助用户轻松地将Python程序分发给最终用户。
怎么把Python脚本打包成可执行程序?
|
8天前
|
Python
探索Python编程的奥秘:打造你的第一个程序
【9月更文挑战第8天】本文将带你进入Python编程的世界,通过一个有趣的项目——制作一个简单的猜数字游戏,让你快速入门。我们不仅会分享代码编写的步骤,还会讲解每一行代码的含义和作用,确保即使是编程新手也能跟上节奏。文章末尾附有完整代码,方便读者实践和学习。
22 12
|
4天前
|
JSON 监控 数据挖掘
Python I/O管理新篇章:优化你的程序,让数据流动更顺畅
【9月更文挑战第13天】在数据驱动时代,Python因其在数据分析、科学计算及Web开发中的广泛应用而备受青睐。本文探讨了Python I/O管理的关键方面,包括理解I/O瓶颈、使用缓冲技术、并发与异步I/O、高效数据序列化及监控调试。通过具体示例,展示了如何优化文件读写和网络通信,提高程序性能。掌握这些技能,可使数据在程序中流动更加顺畅。
16 3
|
4天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
12 3
|
8天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
26 7
|
12天前
|
算法 程序员 Linux
Python编程入门:构建你的第一个程序
【9月更文挑战第4天】编程是现代技术发展的基石,而Python作为一门简洁、易学且功能强大的编程语言,已成为众多初学者的首选。本文将引导你通过一个简单的Python程序,探索编程世界的奥秘,并了解如何利用Python实现基本的算法逻辑。无论你是完全的新手还是希望巩固基础的开发者,这篇文章都将为你提供一个清晰的学习路径。从安装Python环境开始,到编写第一个程序,我们将一步步揭开编程的神秘面纱。
|
9天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
26 0
|
17天前
|
小程序 Python
Python 编程入门:打造你的第一个程序
【8月更文挑战第31天】 在数字化时代,编程已成为一项宝贵的技能。本文将通过一个简单示例引导初学者步入Python编程的世界。我们将从基础语法开始,逐步构建一个小程序,并在此过程中探索编程的逻辑思维与问题解决策略。无论你是科技爱好者还是职场新人,这篇文章都将为你开启编程之旅提供助力。
|
17天前
|
程序员 Python
Python 编程入门:打造你的第一个程序
【8月更文挑战第31天】编程初学者常常在起步时感到迷茫。本文将通过浅显易懂的方式,带领读者从零开始,一步步构建他们的第一个 Python 程序。我们将探索 Python 的安装、基础语法,并通过一个实际的项目——简易计算器,来巩固学习成果。无论你的背景如何,这篇文章都将为你打开编程世界的大门,让你轻松上手,享受编程的乐趣。
|
17天前
|
IDE 程序员 开发工具
Python编程入门:构建你的第一个程序
【8月更文挑战第31天】 本文是专为编程新手设计的Python入门指南,旨在通过一个简单实例引导读者了解Python编程的基础。文章将逐步展示如何从零开始编写一个“Hello, World!”程序,并解释代码中每一部分的功能,帮助初学者建立对Python语言的初步认识和理解。通过本文,读者将学会设置编程环境、编写简单的Python代码以及运行和调试程序。