Python爬虫被识别的核心在于行为不像真人。服务器通过请求特征、交互节奏、JS指纹、会话状态等多维度判断;需伪装完整请求头、模拟人类操作节奏、隐藏自动化痕迹、维护动态会话,细节比工具选择更重要。

Python爬虫被识别,核心不在于用了什么库,而在于行为是否像真人。服务器通过分析请求特征、交互节奏、环境指纹等维度,判断访问者是程序还是用户。关键不是“能不能发请求”,而是“发得像不像人”。
请求头伪装:最基础也最容易露馅的环节
默认的requests请求头带有明显的Python和requests标识,比如User-Agent: python-requests/2.xx,服务器一扫就知是脚本。光换一个User-Agent还不够——真实浏览器会携带Accept、Accept-Language、Referer、Sec-Ch-Ua等十余个头部字段,且字段值之间存在逻辑关联(例如Chrome版本号与Sec-Ch-Ua中的版本需一致)。缺失或错配这些字段,容易触发初级风控。
- 用fake_useragent动态生成主流浏览器UA,避免长期固定同一UA
- 按目标站点常用浏览器补全Accept、Sec-Fetch-*系列头部(如Sec-Fetch-Dest: document)
- Referer应与上一页URL逻辑匹配,比如从列表页跳详情页,Referer不能为空或乱填
请求频率与操作节奏:机器行为的“心跳”漏洞
人类翻页有停顿、滚动有快慢、点击有犹豫;爬虫则常表现为匀速高频请求(如每1秒精准抓1页),或毫秒级完成点击→加载→提取全流程。服务端通过IP粒度统计单位时间请求数、相邻请求间隔的标准差、页面停留时长分布等,能有效识别异常节奏。
- 避免time.sleep(1)式机械等待,改用随机区间(如random.uniform(1.2, 4.8))
- 模拟页面停留:对详情页可延迟1.5–6秒再提取内容,非必须立即处理
- 同IP并发控制在1–2个会话内,切勿多线程猛攻同一域名
JavaScript行为指纹:现代反爬的重点防御区
越来越多网站要求执行JS生成token、校验canvas指纹、监听鼠标轨迹或WebGL参数。Requests无法执行JS,Selenium虽能运行但自带webdriver痕迹(如navigator.webdriver恒为true)、启动慢、资源重。无头浏览器若未清除自动化特征,极易被检测。
立即学习“Python免费学习笔记(深入)”;
- 用undetected-chromedriver3或playwright启用stealth插件,隐藏webdriver标志
- 禁用自动化相关属性:--disable-blink-features=AutomationControlled
- 注入JS绕过canvas指纹检测(如覆盖HTMLCanvasElement.prototype.toDataURL)
Cookies与会话状态:断连即暴露身份
登录态、CSRF Token、加密sign参数往往依赖完整会话链路。Requests手动维护cookie易遗漏HttpOnly字段,Selenium自动携带却可能因页面JS更新了token而未同步。一次token失效或cookie过期,后续请求就会批量返回403或跳转登录页。
- 优先复用浏览器驱动实例,让JS自动管理cookie和storage
- 对关键接口,在请求前主动调用page.evaluate('document.cookie')确认最新态
- 捕获302跳转和401响应,触发重新登录或token刷新流程,而非硬编码固定cookie
反爬本质是行为博弈,没有一劳永逸的方案。重点在于理解目标站的检测逻辑,针对性补足行为缺口,而不是堆砌技术工具。细节到位,比换库更管用。










