Python请求头案例:如何配置请求参数,提升爬虫成功率
目录导读
- 为什么请求头配置如此关键?
- 基础请求头案例:User-Agent与Referer
- 进阶请求头配置:Cookie与Authorization
- 动态请求头:模拟浏览器行为
- 常见错误与调试技巧
- 实战案例:爬取需要登录的网站
- 问答环节:解决你最关心的请求头问题
为什么请求头配置如此关键?
在Python爬虫开发中,请求头(Headers) 是服务器识别客户端身份的核心依据,未正确配置请求头,极易触发反爬机制,导致返回403、503错误或返回空数据。

根据搜索引擎优化(SEO)抓取逻辑,Googlebots和Bingbot均会携带特定User-Agent访问页面,同理,模拟人类浏览器请求能大幅提高爬虫稳定性。正确配置请求头,直接决定爬虫的数据获取成功率。
基础请求头案例:User-Agent与Referer
1 User-Agent(用户代理)
User-Agent标识客户端类型(浏览器、版本、操作系统)。案例:模拟Chrome浏览器
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'
}
response = requests.get('https://httpbin.org/headers', headers=headers)
print(response.json())
2 Referer(来源页)
Referer告诉服务器请求从何而来,常用于防止盗链或模拟正常访问路径。
headers = {
'Referer': 'https://www.example.com/login',
'User-Agent': 'Mozilla/5.0 ...'
}
requests.get('https://www.example.com/api/data', headers=headers)
进阶请求头配置:Cookie与Authorization
1 Cookie(会话标识)
登录后的Cookie可保持会话状态,案例:从浏览器复制Cookie字符串:
headers = {
'Cookie': 'sessionid=abc123; csrftoken=xyz456',
'User-Agent': '...'
}
requests.get('https://weibo.com', headers=headers)
注意事项:Cookie有时效性,动态获取更可靠。
2 Authorization(授权令牌)
API接口常用Bearer Token验证:
headers = {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIs...',
'Content-Type': 'application/json'
}
requests.post('https://api.example.com/upload', headers=headers, json={"data": "value"})
动态请求头:模拟浏览器行为
1 随机User-Agent库
使用fake_useragent库生成随机UA:
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random} # 每次请求不同
2 添加Accept-Language和Accept-Encoding
模拟完整的浏览器请求头:
headers = {
'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',
'Upgrade-Insecure-Requests': '1'
}
常见错误与调试技巧
1 常见错误
- 403 Forbidden:未正确配置User-Agent或Cookie过期
- 415 Unsupported Media Type:缺少Content-Type
- 500 Internal Server Error:请求参数格式错误
2 调试技巧
使用浏览器开发者工具(F12)→ 网络(Network)标签 → 复制请求为cURL格式,再转换成Python代码(推荐curlconverter.com)。
示例:
# 原始curl
curl -H "User-Agent: Mozilla/5.0" -H "Referer: https://example.com" https://target.com
# 转化为requests代码
headers = {'User-Agent': '...', 'Referer': '...'}
requests.get('https://target.com', headers=headers)
实战案例:爬取需要登录的网站
目标:爬取知乎个人主页信息(需登录)。
步骤:
- 手动登录后,从浏览器复制Cookie和User-Agent
- 构建请求头
- 发送请求
url = 'https://www.zhihu.com/people/self'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...',
'Cookie': 'your_cookie_here',
'Referer': 'https://www.zhihu.com/'
}
resp = requests.get(url, headers=headers)
# 解析HTML或JSON数据
注意:知乎反爬严格,建议添加延时并控制请求频率。
问答环节:解决你最关心的请求头问题
Q1:为什么我配置了请求头依然被封?
A:可能原因包括:1)IP请求频率过高;2)缺少某些关键头(如Accept-Language);3)Cookie已过期;4)服务器检测到非浏览器行为(如无JS支持),建议使用代理IP轮换,并模拟完整浏览器请求。
Q2:如何批量生成不同的User-Agent?
A:推荐使用fake_useragent库,调用ua.random即可,或维护一个UA列表,通过random.choice()随机选取。
Q3:请求头中的Content-Type什么时候必须设置?
A:当发送POST请求且包含数据体(如JSON、表单)时必须设置,常用值:application/json、application/x-www-form-urlencoded、multipart/form-data(文件上传)。
Q4:如何获取网站所需的动态请求头(如X-CSRFToken)?
A:先发送GET请求获取页面,用正则或BeautifulSoup提取token值,再携带此值发送POST请求,示例:
# 第一步
resp = session.get('https://example.com/login')
token = re.search(r'name="csrfmiddlewaretoken" value="(.+?)"', resp.text).group(1)
# 第二步
data = {'csrfmiddlewaretoken': token, 'username': 'xxx'}
session.post('https://example.com/login', data=data)
Q5:请求头顺序会影响结果吗?
A:HTTP协议中请求头顺序理论上不影响,但某些网站的反爬机制会检测顺序,建议完全复制浏览器请求头的顺序(可通过开发者工具查看)。
Python请求头配置是爬虫成败的关键环节,从基础User-Agent到动态Cookie、Authorization,再到完整模拟浏览器请求,每一步都能显著提升成功率,遇到反爬时,结合代理IP、延时、随机UA等策略,即可高效获取所需数据。
延伸阅读:建议结合requests库的Session对象管理Cookie,或使用scrapy框架内置的请求头中间件,实现更稳定的爬虫架构。