Python requests 怎么设置 headers 中的 Accept 字段

Leo
Leo
发布时间:2026-10-21| 6人浏览过
原创

在 Python 中使用 requests 发起网络请求时,设置 HTTP 请求头中的 Accept 字段非常直接:只需构造一个包含键值对 {'Accept': '目标MIME类型'} 的字典,并在调用 requests.get() 或 requests.post() 时作为 headers 参数传入即可。本文将详细讲解具体的代码写法、Accept 字段的运作机制、常见媒体类型取值以及调试验证方法。

一、快速上手:单次请求设置 Accept 字段

如果只需要对某个特定接口自定义 Accept 字段,最常用的方式是直接传递字典参数。下面的示例展示了如何显式告知服务端当前客户端期望接收 JSON 格式的响应数据:

import requests

url = "https://httpbin.org/headers"

# 1. 构造包含 Accept 的自定义请求头字典
headers = {
    "Accept": "application/json",
    "User-Agent": "MyCustomClient/1.0"
}

# 2. 通过 headers 参数传入请求方法
response = requests.get(url, headers=headers)

# 3. 打印服务端返回的内容
print("响应状态码:", response.status_code)
print("服务端识别到的请求头:", response.json())

在上述代码中,headers 参数接收标准 Python 字典。当请求发出时,requests 会自动将该字典中的字段与内置的默认请求头进行合并。如果服务端支持该格式,就会优先以 JSON 格式组织并返回数据。

Python requests 怎么设置 headers 中的 Accept 字段
图 1:设置并验证 Accept 字段的完整三步操作

二、核心机制:Accept 字段与 HTTP 内容协商

Accept 属于 HTTP 规范中的请求头(Request Header),用于实现客户端与服务端之间的内容协商(Content Negotiation)。很多初学者容易将 Accept 与 Content-Type 混淆,两者的核心分工如下:

  • Accept:客户端告诉服务端“我希望接收哪种格式的返回数据”。例如指定 application/json 表示希望服务器输出 JSON,而不是返回 HTML 网页或 XML。
  • Content-Type:发起方告诉接收方“当前实体主体(Body)中携带的是什么格式的数据”。例如在 POST 请求中上传 JSON 表单时设置为 application/json。
Python requests 怎么设置 headers 中的 Accept 字段
图 2:内容协商机制中客户端期望与服务端响应的关系示意图

三、常见 Accept 媒体类型取值与场景对照

在实际开发中,根据目标服务接口的类型,Accept 字段会配置不同的 MIME 类型。同时,HTTP 协议支持用逗号分隔多个类型,并使用 q=权重值(0.0 到 1.0)表达优先级:

业务场景 Accept 常见取值 对应 requests 获取方法
RESTful JSON API application/json response.json()
XML 接口 / SOAP application/xml, text/xml response.text 配合 xml 库解析
抓取网页 HTML text/html, application/xhtml+xml response.text 配合 BeautifulSoup
二进制文件 / 图片下载 image/*, application/octet-stream response.content
带优先级的综合协商 application/json;q=0.9, text/html;q=0.8, */*;q=0.1 检查 response.headers['Content-Type']
Python requests 怎么设置 headers 中的 Accept 字段
图 3:四类典型应用场景下的 Accept 头设置与处理模式矩阵

四、进阶技巧:使用 Session 全局持久化设置

当一个模块需要频繁调用同一组 API 时,每次都手动传 headers=headers 既冗长又容易遗漏。借助 requests.Session(),可以将 Accept 等公共请求头设置在会话对象上,后续该会话发出的所有请求都会自动继承该配置:

import requests

# 创建会话对象
session = requests.Session()

# 为该会话配置全局 headers
session.headers.update({
    "Accept": "application/json",
    "User-Agent": "MyDataCollector/2.0"
})

# 后续发起的多次请求均会自动带上 Accept: application/json
r1 = session.get("https://httpbin.org/get")
r2 = session.post("https://httpbin.org/post", json={"query": "test"})

print("请求 1 成功,实际发送的 Accept:", r1.request.headers.get("Accept"))
print("请求 2 成功,实际发送的 Accept:", r2.request.headers.get("Accept"))

注意:如果既在 session.headers 中配置了 Accept,又在单独调用 session.get(url, headers={'Accept': 'text/plain'}) 时指定了不同的值,单次调用的值将覆盖会话级的默认值。

五、排错与验证:如何确认 Accept 字段已正确发送

在开发与排错过程中,很多同学会遇到“设置了 Accept 却没有生效”的疑惑。以下是排查该问题的关键步骤:

1. 查看实际发出的请求头(Prepared Request)

不要只看传入的字典,应当检查响应对象中记录的最终请求信息:

response = requests.get("https://httpbin.org/headers", headers={"Accept": "application/json"})

# 检查实际通过网络发出的请求头信息(大小写不敏感字典)
actual_accept = response.request.headers.get("Accept")
print("实际发出的 Accept 字段:", actual_accept)

通过访问 response.request.headers,可以清晰看到经过 requests 处理合并后的最终报文头部。

2. 服务端返回 406 Not Acceptable

如果请求返回了 HTTP 状态码 406 Not Acceptable,说明服务端成功解析了你传入的 Accept 字段,但服务端目前无法提供该格式的数据。此时应当核对接口文档支持的媒体类型,或者将 Accept 调整为更宽泛的通配符(例如 */*)。

3. 服务端完全忽略 Accept

并非所有 Web 服务端都严格实现了 HTTP 内容协商协议。一些简易后端接口即使收到 Accept: application/json,也可能固定返回 HTML 或纯文本。此时需要通过阅读服务端开发文档,确认是否改用 URL 查询参数(如 ?format=json)或专用路由。

Python requests 怎么设置 headers 中的 Accept 字段
图 4:设置方法、验证手段与异常排查全景图

六、总结

在 Python requests 中设置 Accept 字段非常简捷:

  1. 单次请求时,直接通过 requests.get(url, headers={'Accept': '...'}) 传参;
  2. 批量或长效请求时,推荐使用 session.headers.update({'Accept': '...'}) 统一管理;
  3. 调试时通过 response.request.headers['Accept'] 验证最终发出的请求头,并结合 response.headers['Content-Type'] 确认服务端协商结果。

只要理清 Accept(告知期望)与 Content-Type(实体标识)的职责差异,就能在调用各类 Web API 和处理数据抓取时准确获取目标格式的数据。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。