403是服务器识别出爬虫所致,因requests默认请求头过于“干净”:user-agent为python-urllib/3.x、缺失referer/accept-language、cookie为空,且真实浏览器所需的sec-ch-ua等字段全无,导致被立即拦截。

403 不是服务器抽风,而是它清楚地认出你不是真人——requests 默认发包太“干净”,User-Agent 是 python-urllib/3.x,没 Referer、没 Accept-Language、Cookie 为空,等于拿身份证复印件去银行办业务,还盖着“爬虫专用”钢印。
requests 默认请求头为什么必然触发 403
绝大多数网站的反爬第一道关卡就是请求头校验。服务器一收到 User-Agent: python-urllib/3.14 这种标识,基本秒拒。
-
requests.get("https://example.com")发出的请求,headers是空的(除基础Accept外),连大小写都按 RFC 规范自动标准化,反而暴露了库特征 - 真实浏览器请求至少带
User-Agent、Accept、Accept-Language、Sec-Ch-Ua、Referer等 6–10 个字段;缺任意一个,某些站点(如知乎、京东)会直接返回 403 - 用 F12 → Network → 刷新 → 点开任意请求 → Headers → Request Headers,复制整块内容,粘进 Python 字典里,比网上搜的 UA 更可靠
Referer 和 Cookie 组合失效的典型表现
加了 User-Agent 还 403?大概率是 Referer 写错或 Cookie 过期。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
Referer必须是该页面的合法上级来源,比如从https://example.com/list跳转到/item/123,Referer就得是前者;填空字符串、填错协议(http://对https://目标)、填成 Google 搜索页,都会被拦截 -
Cookie不是复制粘贴就能用:含Expires或Max-Age的字段已过期,或绑定 UA/IP/时间戳,换环境就作废;优先用requests.Session()自动管理,别手动硬塞 - 某些站点要求
Cookie和User-Agent严格匹配——改了 UA 却没刷新 Cookie,旧 Cookie 直接被拒
Selenium/Playwright 启动后仍 403 的根本原因
能渲染 ≠ 能过检。现代防护(如 Cloudflare)不看你有没有 JS 执行能力,而看你的“行为指纹”是不是人工。
- Selenium 默认启动的 Chrome 会暴露
navigator.webdriver === true,很多站直接 403;必须加参数:options.add_argument("--disable-blink-features=AutomationControlled"),再执行driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...})覆盖关键属性 - Playwright 默认更隐蔽,但若启用
accept_downloads=True或其他非必要上下文选项,也可能引入可检测特征;建议初始化时只设user_agent和viewport - 别一上来就用
headless=True—— 先开界面跑一次,确认页面真能加载、元素真能点中,再逐步加隐藏逻辑;否则连问题出在哪都看不到
代理 IP 设置了还是 403?三个检查点
代理不是万能解药,反而可能让问题更隐蔽。
- 先验证代理是否生效:
requests.get("https://httpbin.org/ip", proxies=proxies),返回 IP 必须和代理一致;否则流量实际走的是本机出口 - 商用代理必须带认证,格式为
http://user:pass@host:port;漏掉user:pass@或误写成https://前缀,requests会静默降级,结果仍是本地 IP - 免费代理大多已被 Cloudflare/Akamai 拉黑;高匿 ≠ 可用,有些代理出口 IP 本身就在黑名单里,一发请求就触发 403 + “Checking your browser” 页面
最常被忽略的一点:403 往往不是单点问题,而是组合失效。比如你修好了 User-Agent,却忘了 Referer 随 URL 动态变化;或者用了 Session,但没把登录响应里的 Set-Cookie 完整收下——差一个字段,服务器就当你是来捣乱的。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










