服务器通过请求头识别出非浏览器访问导致失败,因requests默认User-Agent等字段不完整且缺乏JS执行能力,Selenium/Playwright若未隐藏自动化特征也会被WAF拦截。

不是代码写错了,而是服务器通过请求头识别出了你不是浏览器。
requests 默认发的是“裸请求”
requests 库默认的 User-Agent 是类似 python-requests/2.31.0 这样的字符串,服务器一扫就判定为自动化工具。浏览器访问时,User-Agent 是带完整平台、渲染引擎、版本号的长串,比如 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36。光换 UA 还不够——很多站点会校验配套字段是否自洽:
-
Accept、Accept-Language、Accept-Encoding缺一可能触发 403 -
Sec-Ch-Ua、Sec-Fetch-Dest等 Chromium 新增头,没带等于“身份证缺页” -
Referer必须匹配上一页 URL,否则被当成非法跳转
浏览器里能过,不代表“没反爬”
你以为只是看页面,其实浏览器在后台做了很多事:执行 JS 生成 token、读取本地存储、计算 canvas 指纹、上报硬件并发数……这些行为 requests 根本不参与。常见现象包括:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 响应 HTML 里有大量
document.write或eval,说明内容靠 JS 渲染 - 返回中含
__jsl_clearance_s=或ak_bmsc=,代表中间有奇安信、百度云加速等 WAF - 状态码是 200,但正文为空或只有加密 script 标签
Selenium/Playwright 启动后还是 403
这说明问题不在“有没有渲染”,而在“渲染出来的环境是否被识别为自动化”。Selenium 默认启动的 Chrome 会暴露 navigator.webdriver === true,Playwright 也会带 Puppeteer 或 HeadlessChrome 痕迹。实操中容易忽略的关键点:
立即学习“Python免费学习笔记(深入)”;
- 没禁用
automationControlled特征:Selenium 需加--disable-blink-features=AutomationControlled参数 - 没覆盖
navigator.webdriver:得用driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...}) - 直接开 headless 模式调试:建议先关闭 headless,人工确认页面真能加载再加隐藏逻辑
- 用了 Playwright 但没关
accept_downloads以外的无关选项,反而增加指纹特征
真正卡住人的地方,往往不是“该不该换方案”,而是“该换哪一层”。比如明明只需要补全 Sec-Fetch-Site 就能过,却花两天配 Selenium;或者已经进了 JS 渲染层,还在徒劳地轮换 UA。抓一次浏览器真实请求的完整 headers,比查十篇教程都管用。

















