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

如何在Python Requests库中将Accept-Encoding与Content-Encoding头设为None?

关于Python Requests中设置请求头为None的问题

首先直接说结论:你不能通过将Accept-Encoding和Content-Encoding设为None来让这些请求头消失,因为Requests库对部分请求头有内置的处理逻辑,设置None并不会移除它们,反而可能被替换成默认值。

为什么你的设置没生效?

从你提供的Wireshark捕获结果来看:

  1. Accept-Encoding: identity:当你把这个头设为None时,Requests并没有移除它,而是自动替换成了identity——这是HTTP协议中表示「不接受压缩内容」的特殊编码值,属于库的默认 fallback 逻辑。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:51:33