pin_drop当前位置:知识文库 ❯ 图文

requests库设置HTTP请求头 - User-Agent与Authorization详解

一、概述

HTTP请求头(Headers)是HTTP请求的重要组成部分,携带了客户端环境信息、内容类型、认证凭证等元数据。在Python的requests库中,通过headers参数可以方便地自定义请求头,这在模拟浏览器访问、API认证、内容协商等场景中非常关键。

合理设置请求头可以解决反爬虫限制、编码问题和内容格式协商等问题。例如,很多网站会通过检查User-Agent来识别请求是否来自真实浏览器,此时我们就需要在请求头中设置浏览器的标识来绕过检测。


二、语法与参数说明

基本语法

代码示例

import requests

# GET请求设置请求头
requests.get(url, headers=dict, **kwargs)

# POST请求设置请求头
requests.post(url, headers=dict, **kwargs)

# 其他HTTP方法同理(PUT、DELETE、PATCH等)

参数说明

参数 类型 默认值 说明
headers dict None 请求头字典,键值对形式

三、常用请求头字段

以下是HTTP请求中最常用的请求头字段及其作用:

请求头字段 说明 示例值
User-Agent 客户端标识,告诉服务器你是谁 Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Content-Type 请求体数据类型 application/json
Accept 可接受的响应类型 application/json, text/html
Authorization 认证凭证 Bearer token_string
Cookie 请求携带的Cookie session_id=abc123
Referer 来源页面URL https://example.com/page
Accept-Encoding 可接受的压缩编码 gzip, deflate
Accept-Language 可接受的语言 zh-CN,zh;q=0.9,en;q=0.8
X-Request-ID 请求唯一标识(自定义) uuid-string

四、代码示例

示例1:模拟浏览器请求

很多网站会根据请求的User-Agent来判断是否为真实浏览器。下面演示如何设置完整的浏览器请求头来绕过简单的反爬虫检测:

代码示例

import requests

# 设置浏览器请求头,绕过简单的反爬虫检测
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
}

response = requests.get('https://httpbin.org/headers', headers=headers)
result = response.json()

print(f"User-Agent: {result['headers'].get('User-Agent', '未设置')[:50]}...")
print(f"Accept: {result['headers'].get('Accept', '未设置')[:40]}...")
print(f"Accept-Language: {result['headers'].get('Accept-Language', '未设置')}")

输出:

代码示例

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleW...
Accept: text/html,application/xhtml+xml,application/xml;q=0...
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

示例2:API认证请求头

在现代Web API中,认证通常通过请求头中的Authorization字段完成。最常见的两种方式如下:

代码示例

import requests

# 方式1:Bearer Token认证(JWT令牌)
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0'
headers_bearer = {
    'Authorization': f'Bearer {token}',
    'Accept': 'application/json'
}

response = requests.get('https://httpbin.org/headers', headers=headers_bearer)
result = response.json()
print(f"Bearer认证: {result['headers'].get('Authorization', '未设置')[:30]}...")

# 方式2:API Key认证(常用于第三方服务)
api_key = 'sk-abc123def456'
headers_apikey = {
    'X-API-Key': api_key,
    'Accept': 'application/json'
}

response2 = requests.get('https://httpbin.org/headers', headers=headers_apikey)
result2 = response2.json()
print(f"API Key: {result2['headers'].get('X-Api-Key', '未设置')}")

输出:

代码示例

Bearer认证: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
API Key: sk-abc123def456

示例3:内容协商与自定义请求头

通过Accept头可以告诉服务器我们期望的响应格式,同时可以添加自定义请求头用于请求追踪和客户端标识:

代码示例

import requests

# 内容协商:告诉服务器我们希望接收JSON格式
headers = {
    'Accept': 'application/json',  # 只接受JSON响应
    'Content-Type': 'application/json',  # 发送JSON数据
    'X-Request-ID': 'req-20240101-001',  # 自定义请求追踪ID
    'X-Client-Version': '2.0.0',  # 客户端版本
    'Cache-Control': 'no-cache'  # 不使用缓存
}

response = requests.get('https://httpbin.org/headers', headers=headers)
result = response.json()

# 提取自定义的X-开头的请求头
custom_headers = {k: v for k, v in result['headers'].items() if k.startswith('X-')}
print("自定义请求头:")
for key, value in custom_headers.items():
    print(f"  {key}: {value}")

输出:

代码示例

自定义请求头:
  X-Client-Version: 2.0.0
  X-Request-Id: req-20240101-001

五、实际应用场景

  • 场景1:爬虫开发:设置User-Agent模拟浏览器访问,绕过基于UA的反爬虫机制。结合Referer、Accept-Language等请求头可以更真实地模拟用户行为。

  • 场景2:API认证调用:调用需要认证的REST API,在请求头中携带Authorization令牌(如JWT Token、API Key等),实现安全的接口访问。

  • 场景3:微服务链路追踪:在微服务架构中,通过自定义请求头(如X-Request-ID、X-Trace-ID)传递链路追踪信息,方便问题排查和性能分析。


六、注意事项

注意1:请求头的键名不区分大小写,但惯例上使用首字母大写的连字符格式(如Content-Type、User-Agent)。

注意2:requests默认会发送一些请求头(如User-Agent为python-requests/x.x.x),自定义headers会覆盖默认值。如果只想在默认基础上追加,可以先获取默认headers再更新。

注意3:不要在请求头中硬编码敏感信息(如API Key、Token),应从环境变量或配置文件中读取,避免泄露凭证。


七、请求头设置方式对比

在requests库中,有多种方式可以设置请求头,适用于不同的场景需求:

方式 适用场景 优点 缺点
headers参数 单次请求 简单直接 每次请求都需设置
Session.headers 多次请求 全局生效,避免重复 所有请求共享同一headers
PreparedRequest 底层控制 完全自定义 使用复杂
auth参数 认证场景 自动处理认证 仅限认证场景

小贴士

如果你需要对多次请求使用相同的请求头(比如每次请求都需要携带相同的User-Agent和Authorization),推荐使用requests.Session(),通过session.headers.update()设置全局请求头,这样可以避免每次请求都重复设置,同时还能复用TCP连接提升性能。


八、小结

  • 请求头是HTTP请求的重要组成部分,携带客户端信息和元数据。

  • User-Agent是最常自定义的请求头,用于模拟浏览器或标识客户端。

  • 认证信息通过Authorization请求头传递,支持Bearer Token、Basic Auth等多种认证方式。

  • 多次请求使用相同请求头时,推荐使用Session统一管理,简化代码并提升性能。


九、练习题

练习1

编写程序,设置User-Agent为Chrome浏览器标识,访问 https://httpbin.org/user-agent,对比默认UA和自定义UA的差异。

练习2

编写程序,在请求头中携带Bearer Token和自定义的X-Request-ID,发送GET请求并打印服务器收到的请求头。

练习3

编写一个函数,自动从环境变量读取API Key并设置到请求头中,避免在代码中硬编码敏感信息。


常见问题

1. requests默认的User-Agent是什么?

requests默认的User-Agent格式为"python-requests/x.x.x",其中x.x.x是requests的版本号。很多网站会检测这个标识,如果识别为requests发起的请求可能会被拒绝访问。因此建议自定义User-Agent模拟浏览器。

2. 如何在请求头中传递Cookie?

可以通过headers参数直接设置Cookie字段:headers = {'Cookie': 'key1=value1; key2=value2'}。但更推荐使用requests的cookies参数或Session对象来管理Cookie,因为后者会自动处理Cookie的编码和解析。

3. 请求头的键名是否区分大小写?

根据HTTP协议规范,请求头的键名不区分大小写。Content-Type、content-type、CONTENT-TYPE是等价的。但按照惯例,通常使用首字母大写的连字符格式(如Content-Type)。

4. 如何查看requests发送的完整请求头?

可以通过Response对象的request.headers属性查看实际发送的请求头:response = requests.get(url, headers=headers); print(response.request.headers)。这将显示包括默认头和自定义头在内的完整请求头信息。

5. Bearer Token和Basic Auth有什么区别?

Bearer Token使用"Authorization: Bearer "格式,适用于JWT等令牌认证;Basic Auth使用"Authorization: Basic "格式,适用于简单的用户名密码认证。Bearer Token更安全、更灵活,是现代API的首选认证方式。

标签: requests 请求头 User-Agent HTTP请求 Python教程 API认证

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: requests.delete()详解 - Python发送DELETE请求完整教程 下一篇: requests库请求参数详解 - params、data与json用法指南

poll相关推荐