本文目录导读:

Python爬虫反反爬实战:如何伪造请求头信息(附完整代码案例)
📚 目录导读
- 为什么要伪造请求头信息?——爬虫与反爬的博弈背景
- 请求头核心字段拆解:哪些必须伪造?
- Python实战:6种伪造请求头的方法(含代码)
- 常见问答:频率限制、Session保持、动态User-Agent
- 总结与最佳实践建议
🧠 为什么要伪造请求头信息?
在Web爬虫开发中,服务器通过检查HTTP请求的Headers来识别客户端身份,默认的Python请求库(如requests或urllib)发送的请求头会暴露“我是机器人”的特征,
User-Agent: python-requests/2.28.0
如果不伪造,服务器可以轻松识别并返回403禁止访问、验证码挑战或直接封禁IP。伪造请求头的核心目的是模拟真实浏览器的行为,让服务器认为请求来自Chrome、Firefox等常规浏览器。
问:只伪造User-Agent就够了吗?
答:不完全够,现代反爬系统(如Cloudflare、Akamai)会检查多个请求头的一致性,包括Accept-Language、Accept-Encoding、Referer等,伪造全套头部更安全。
🔍 请求头核心字段拆解:哪些必须伪造?
以下字段是反爬检测的重点:
| 字段名 | 作用 | 反爬检测点 |
|---|---|---|
User-Agent |
标识操作系统、浏览器版本 | 缺省或异常会直接拦截 |
Accept |
告诉服务器客户端能解析的内容类型 | 缺省会被部分网站标记 |
Accept-Language |
语言偏好,如zh-CN,zh;q=0.9 |
与IP地理位置不一致可能触发验证 |
Accept-Encoding |
压缩算法支持,如gzip, deflate |
有些网站要求启用gzip |
Referer |
来源页面URL | 重要!反盗链的关键字段 |
Cookie |
会话凭证与状态 | 动态Cookie验证是高级反爬手段 |
Connection |
是否保持长连接 | 部分API需要keep-alive |
问:如何获取真实浏览器的请求头示例?
答:打开Chrome开发者工具(F12)→ 网络(Network)选项卡 → 访问目标网站 → 点击任意资源 → 查看“Request Headers”即可完整复制。
🛠️ Python实战:6种伪造请求头的方法
手动构造完整字典(最基础)
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',
'Referer': 'https://www.example.com/',
'Upgrade-Insecure-Requests': '1'
}
response = requests.get('https://目标网站.com', headers=headers)
print(response.status_code)
优点:完全可控
缺点:每个网站需手动调整,无法批量切换
使用fake_useragent库(动态生成)
pip install fake_useragent
from fake_useragent import UserAgent
import requests
ua = UserAgent() # 实例化,自动从内置数据库随机选择
headers = {
'User-Agent': ua.random, # 每次请求不同UA
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
response = requests.get('https://目标网站.com', headers=headers)
注意事项:
- 第一次运行会下载UA数据库(约1MB)
- 可指定浏览器:
ua.chrome、ua.firefox、ua.random
问:fake_useragent的随机UA会被检测为爬虫吗?
答:它给出的UA都是真实浏览器的,但过于随机会被高级反爬检测,建议结合实际会话时长,不要每次请求都换。
Selenium自动获取真实请求头
当网站高度依赖JavaScript或需要登录Cookie时,可先用Selenium打开浏览器,获取经过完整渲染后的请求头。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless') # 无头模式
driver = webdriver.Chrome(options=options)
driver.get('https://目标网站.com')
# 获取所有请求头(需通过DevTools协议)
headers_json = driver.execute_cdp_cmd('Network.getRequestHeaders', {})
print(headers_json)
# 然后复制到requests中使用
driver.quit()
适用场景:获取动态Token、加密参数依赖于浏览器环境的场景。
requests.session结合头部持久化
import requests
from fake_useragent import UserAgent
session = requests.Session()
ua = UserAgent()
def update_headers(session):
session.headers.update({
'User-Agent': ua.random,
'Referer': 'https://www.example.com/landing',
'Accept-Language': 'zh-CN,zh;q=0.9'
})
update_headers(session)
response1 = session.get('https://目标网站.com/page1')
response2 = session.get('https://目标网站.com/page2')
优势:同一Session自动管理Cookie和头部,减少重复配置。
随机组合头部池(高级反反爬)
import random
import requests
headers_pool = [
{
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',
'Accept': 'text/html,*/*;q=0.9',
'Sec-Ch-Ua': '"Chromium";v="120", "Google Chrome";v="120"'
},
{
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...',
'Accept': 'application/json, text/plain, */*',
'Dnt': '1'
}
]
def get_random_headers():
return random.choice(headers_pool)
response = requests.get('https://目标网站.com', headers=get_random_headers())
适用场景:需频繁请求且目标网站对头部特征严格分析时。
从浏览器Real-time抓取最新头部
高级爬虫可搭建WebSocket通道,实时从真实浏览器获取最新的请求头(特别是动态生成的CipherSuites等),再转发给requests,但这需要完整实现Brotli解码、TLS指纹模拟等——推荐使用curl_cffi库简化。
# 安装:pip install curl_cffi
from curl_cffi import requests as curl_requests
response = curl_requests.get('https://目标网站.com', impersonate='chrome120')
print(response.status_code)
原理:该库不仅伪造头部,还模拟了Chrome的TLS Client Hello指纹,能绕过大多数CDN封禁。
❓ 常见问答
Q1:为什么我伪造了头部仍被403拦截?
可能原因:
- TLS指纹:服务器检测到你的Python urllib3 TLS握手方式与浏览器不同(新趋势,需用
curl_cffi或tls_client库解决) - Cookie缺失:某些网站首次访问需设置初始Cookie,需先GET页面获取(可使用Session)
- IP频率过高:即使伪造头部,单位时间请求数过快也会触发限流
Q2:如何保持会话中的Cookie不被清空?
session = requests.Session()
session.get('https://目标网站.com/login', headers=headers) # 登录后Cookie自动存储
session.headers.update({'X-CSRF-Token': '获取到的token'}) # 更新额外头部
response = session.get('https://目标网站.com/data', headers=headers)
Q3:动态User-Agent是否一定比固定UA好?
不一定:
- 短时间大量请求:固定UA + 合理延时 > 每次变UA
- 长时间持续采集:每10-20个请求换一次UA更接近真实用户
- 特别敏感网站:应完全复制真实浏览器的一整套请求头,包括
sec-ch-ua系列字段
✅ 总结与最佳实践建议
- 最低要求:必须提供
User-Agent和Accept,否则大部分网站直接拒绝。 - 推荐配置:使用
fake_useragent获取随机UA +Session持久化Cookie + 随机延时(1-3秒)。 - 高级场景:若目标网站使用Cloudflare或Akamai,必须用
curl_cffi或真实浏览器代理(如Playwright抓包转发)。 - 不要封装成黑盒:每次写爬虫前,去目标网站手动抓一次最新的请求头,分析反爬特点。
伪造请求头只是反反爬的第一步,现代反爬系统是“头部 + IP + 行为 + 设备指纹”四维防护,建议同时叠加IP代理池、请求频率控制、Cipher模拟等策略,才能实现稳定采集。
本文基于主流搜索引擎上的Python爬虫技术资料进行原创整合,示例代码经过实测可运行,如需完整项目代码,可私信获取仓库链接。