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等)
参数说明
三、常用请求头字段
以下是HTTP请求中最常用的请求头字段及其作用:
四、代码示例
示例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库中,有多种方式可以设置请求头,适用于不同的场景需求:
小贴士
如果你需要对多次请求使用相同的请求头(比如每次请求都需要携带相同的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
本文涉及AI创作
内容由AI创作,请仔细甄别