requests.get()传自定义请求头需在headers参数中传字典,必须覆盖User-Agent并补全Accept、Accept-Language等字段;避免用fake_useragent,建议自维护含最新UA及配套字段的headers池,每次随机选取。

requests.get() 里怎么传自定义请求头
直接在 headers 参数里传一个字典就行,不用额外配置或启动 session。关键点是:必须覆盖 User-Agent,否则默认是 python-requests/2.x,一抓就被封。
常见错误是只写 User-Agent 却漏掉 Accept、Accept-Language 这些基础字段,导致服务器返回 406 或跳转到验证页。
-
User-Agent必须模拟真实浏览器(如 Chrome、Firefox 最新版) -
Accept推荐设为text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -
Accept-Language建议用zh-CN,zh;q=0.9,en;q=0.8,避免纯英文 UA 被识别为爬虫 - 不要硬编码固定值,否则所有请求头都一样,容易被行为分析识别
用 fake_useragent 库生成随机 UA 会出什么问题
fake_useragent 默认从远程 URL(如 https://www.useragents.me/)拉取数据,首次运行会卡住甚至超时失败;更麻烦的是它会把数据缓存到本地 useragents.json,而这个文件可能几个月不更新,拿到的 UA 多是过期版本(比如 Chrome 110 以下),反而暴露特征。
实际建议绕开它,自己维护一份轻量 UA 池:
立即学习“Python免费学习笔记(深入)”;
- 从主流浏览器官网或 caniuse.com 查最新稳定版 UA 字符串(例如 Chrome 126、Edge 125、Firefox 127)
- 每条 UA 配上对应
Accept和Accept-Language,组成完整 header 字典 - 用
random.choice()每次取一个,不依赖网络、不读磁盘、响应快
示例片段:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
headers_pool = [
{
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
},
{
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}
]
为什么加了随机 UA 还是被识别为爬虫
UA 只是第一层伪装。服务器还会检查:Accept-Encoding 是否支持 gzip, deflate, br;Sec-Ch-Ua、Sec-Ch-Ua-Mobile 等 Chromium 新增的客户端 hints 字段;甚至 TCP 握手时序、TLS 指纹——这些 requests 默认不发,但真实浏览器会带。
所以别指望单靠换 UA 就能绕过 Cloudflare 或极验。务实做法是:
- 优先加
Accept-Encoding: gzip, deflate(requests 默认已支持,但要显式声明) - 对高防站点,放弃 requests,改用
playwright或undetected-chromedriver3启动真实浏览器 - 如果必须用 requests,至少补全
Sec-Fetch-*系列字段(如Sec-Fetch-Dest: document),虽然不能完全骗过,但能过滤掉一批基础风控规则
requests.Session() 里设置 headers 有没有副作用
有。一旦调用 session.headers.update(...),后续所有 session.get() / session.post() 都会复用这套 headers,包括重定向后的请求——而重定向目标站可能要求不同 UA 或语言偏好,结果反而触发异常。
更安全的做法是每次请求单独传 headers:
- 用函数封装请求逻辑,每次生成新 headers 字典
- 避免在 session 层级做全局 headers 设置
- 若需 cookie 自动管理,仍可用 session,但 headers 必须走参数传入,不污染 session 实例
容易忽略的一点:某些网站会根据 Referer 判断来源,如果你从 A 页面跳转到 B 页面,B 的请求里没带 Referer: A_URL,也会被拦截。这时 headers 不仅要随机,还得按流程动态构造。

















