Python 爬虫被识别主因是行为暴露“非人”特征。服务器通过请求频率、鼠标轨迹、JS 执行环境、HTTP 头、TLS 指纹等多维建模识别;需动态 UA、Session 管理、正态延时、Playwright 替代 Selenium、禁用 webdriver、模拟真实鼠标移动、使用 tls-client 复刻 TLS 指纹。

Python 爬虫被识别,往往不是因为用了 requests 还是 selenium,而是行为暴露了“非人”特征。服务器通过请求频率、鼠标轨迹、JS 执行环境、HTTP 头细节、TLS 指纹等多维度建模判断是否为真实 浏览器,而多数 Python 脚本在这些环节天然露馅。
HTTP 请求头与会话行为异常
直接用 requests 发请求时,User-Agent常固定不变,且缺少 Accept、Accept-Language、Sec-Ch-Ua 等现代浏览器必带的头部字段;Cookie 不随跳转自动管理,Referer 缺失或错乱;两次请求间隔恒为 0.1 秒,形成完美等差数列——这在人类浏览中几乎不存在。
- 每次请求前动态生成合理 UA(如从常见浏览器列表中随机选,并同步更新 Sec-Ch-Ua)
- 启用 Session 对象管理 Cookies,手动设置 Referer 与上一页 URL 一致
- 在请求间插入符合正态分布的随机延时(如均值 1.2 秒,标准差 0.4 秒),避开固定节奏
JavaScript 执行环境缺失
目标站点若依赖 window.navigator、WebGL 指纹、AudioContext 采样或 canvas.toDataURL()生成设备指纹,requests 和普通 urllib 完全无法执行 JS,返回的 HTML 里关键数据为空或被遮蔽。即使加了 headers,服务端仍可通过 fetch 调用失败、navigator.plugins 长度为 0 等特征判定为无头环境。
- 优先考虑 Playwright 或 Pyppeteer 替代 Selenium:它们默认启用真实 Chromium,支持 WebGL/Audio/Canvas 完整上下文
- 禁用自动化特征:启动时添加
--disable-blink-features=AutomationControlled,并覆盖navigator.webdriver为 undefined - 必要时注入 JS 补全缺失属性,例如伪造 plugins、mimeTypes 数组,但需注意版本一致性
鼠标与页面交互模式失真
用 Selenium 模拟点击时,若元素定位后立即 click(),或 move_to_element().click()路径是直线瞬移,缺乏加减速、微小偏移、悬停抖动等生物行为特征。高级反爬会记录鼠标移动轨迹的贝塞尔曲线拟合度、停留时间分布,甚至检测 pointer-events 触发顺序。
立即学习“Python 免费学习笔记(深入)”;
- 使用 ActionChains 模拟真实移动:先 move_by_offset(0,0)激活事件,再分段移动,每段加入 50–200ms 随机停顿
- 点击前在目标区域周边 5–15 像素内随机悬停 300–800ms,模拟视觉确认过程
- 避免全页截屏或频繁 get_attribute(“innerHTML”),改用 element.screenshot_as_png 局部截图验证可见性
TLS 指纹与网络层痕迹
Python 默认 SSL 库(urllib3 + OpenSSL)握手时发送的 ALPN 协议列表、支持的加密套件顺序、TLS 扩展排列,与 Chrome/Firefox 存在显著差异。一些 WAF(如 Cloudflare 最新版)已将 TLS 指纹纳入实时风控模型,单纯换 UA 无效。
- 使用 tls-client 或curl_cffi库发起请求:它们复刻主流浏览器 TLS 握手指纹,支持自动同步 Chrome 版本变更
- 避免混用不同底层库(如 requests + selenium 共用同一 IP),防止 TCP 连接池行为冲突暴露脚本逻辑
- 高敏感站点建议搭配 residential proxy,并确保每个 IP 只承载单一用户会话,会话间间隔不低于 90 秒






























