如何在Python Requests库中将Accept-Encoding与Content-Encoding头设为None?
关于Python Requests中设置请求头为None的问题
首先直接说结论:你不能通过将Accept-Encoding和Content-Encoding设为None来让这些请求头消失,因为Requests库对部分请求头有内置的处理逻辑,设置None并不会移除它们,反而可能被替换成默认值。
为什么你的设置没生效?
从你提供的Wireshark捕获结果来看:
- Accept-Encoding: identity:当你把这个头设为
None时,Requests并没有移除它,而是自动替换成了identity——这是HTTP协议中表示「不接受压缩内容」的特殊编码值,属于库的默认 fallback 逻辑。 - Content-Encoding: deflate:这个头更奇怪,因为Requests默认不会主动添加它。大概率是你设置
Content-Encoding: None后,库没有正确处理这个值,反而触发了内部的压缩逻辑(即使你的请求体是空的)。
如何实现你想要的请求头?
要完全移除这些不需要的头,正确的做法是不要在headers字典中包含它们,或者手动删除Requests自动添加的默认头。这里分两种情况:
1. 基础方案:只保留需要的头
如果你只需要发送指定的几个头,直接在headers里只写你要的键:
import requests url = "你的目标URL" # 只保留你明确需要的请求头 headers = { "Expect": "100-continue", "Cookie": "Some cookies" } response = requests.post(url, headers=headers, data='')
不过这个方案有个问题:Requests会自动添加一些默认头(比如Accept-Encoding、User-Agent、Accept),如果你想彻底去掉这些,需要用下面的进阶方案。
2. 进阶方案:手动构建请求(完全控制头)
使用PreparedRequest可以完全掌控请求的所有细节,包括删除自动添加的默认头:
from requests import Request, Session session = Session() url = "你的目标URL" # 只定义你需要的头 custom_headers = { "Expect": "100-continue", "Cookie": "Some cookies" } # 构建请求对象 req = Request('POST', url, headers=custom_headers, data='') prepped = req.prepare() # 删除所有你不需要的默认头 unwanted_headers = ['Accept-Encoding', 'Accept', 'User-Agent', 'Connection', 'Content-Encoding'] for header in unwanted_headers: if header in prepped.headers: del prepped.headers[header] # 发送请求 response = session.send(prepped)
这样发送的请求头就会和你预期的完全一致:
POST URL HTTP/1.1
Content-Length: 0
Expect: 100-continue
Host: HOST
Cookie: Cookies
关键注意点
- 永远不要用
None来移除请求头:对大多数头来说,设置None会被Requests忽略,但对Accept-Encoding这类有特殊逻辑的头,会被替换成默认值。 Content-Encoding只在你主动压缩请求体时才需要设置:如果请求体没有压缩,完全不要在headers里加这个键,避免触发库的自动压缩逻辑。
内容的提问来源于stack exchange,提问作者Screek
相关产品推荐
相关产品推荐

