本文目录导读:

针对数据爬取(尤其是恶意爬虫)的防护与阻断,需要采取一套多层次、综合性的策略,单纯依赖某一种方法(如只加验证码)往往效果有限。
防护思路分为四个层面:请求检测与拦截、频率限制、内容混淆与动态化、以及法律与技术结合。
以下是具体的防护与阻断方法,按从易到难、从基础到高级的顺序排列:
第一层:基础的请求特征检测(简单有效,但易被绕过)
爬虫的请求通常与真实用户不同,可以通过检测这些特征进行阻断。
-
User-Agent 与请求头(最基础)
- 做法:检查 HTTP 请求的
User-Agent、Referer、Accept-Language等字段,爬虫的 UA 通常非常规(如python-requests/2.x),或者请求头顺序不符合标准浏览器。 - 防护:直接拒绝已知的爬虫 UA(如
Scrapy、Requests、curl等),或要求请求头必须包含完整的浏览器特征。 - 弱点:爬虫可以伪造任何请求头,因此这只是第一道过滤。
- 做法:检查 HTTP 请求的
-
IP 访问频率限制(Rate Limiting)
- 做法:监控单个 IP 在固定时间窗口内的请求次数。
- 防护:如果某个 IP(如 1分钟内请求超过 100次)则返回 429(Too Many Requests)状态码,或直接封禁 IP 一段时间。
- 升级版:使用令牌桶算法或漏桶算法实现更平滑的限流。
- 弱点:爬虫可以使用 IP 代理池轮换 IP。
-
Cookies 与 Session 验证
- 做法:要求请求必须携带有效的 Session Cookie。
- 防护:即使 API 是公开的,也要求先访问一个页面获取 Session ID,后续请求必须携带,爬虫往往直接调用 API 而忽略了这一步骤。
第二层:中级防护(增加爬虫的抓取成本)
当基础特征被伪造后,需要引入用户行为验证。
-
验证码(CAPTCHA)
- 做法:在登录、搜索、高频操作时加入验证码。
- 类型:图形验证码、滑块验证码(滑动拼图)、点选验证码、行为式验证码(无感验证)。
- 防护:对短时间内出现异常行为的 IP 强制要求人机验证。
- 弱点:有损用户体验;部分简单验证码可被 OCR 或机器学习破解;增加服务器成本。
-
JS 动态渲染与浏览器指纹
- 做法:在前端通过 JavaScript 计算一个 token(如签名)或采集浏览器指纹(Canvas 指纹、WebGL 指纹、字体指纹、屏幕分辨率等)。
- 防护:只有当服务器验证了这个动态计算的 token 或指纹完整时,才返回数据,爬虫如果使用纯代码(如 requests)不执行 JS,则无法获取正确数据。
- 弱点:高级爬虫可以使用 Selenium、Puppeteer 等无头浏览器,但仍会被检测到无头特征。
-
IP 黑/白名单与地理位置限定
- 做法:维护已知的数据中心 IP 段黑名单或 AWS/阿里云 IP 库。
- 防护:封禁所有海外 IP 或已知云服务商的 IP。
- 弱点:如果爬虫使用住宅代理,此方法失效。
第三层:高级防护(动态化与混淆)
这是当前对抗高效爬虫的核心手段。
-
数据动态渲染与接口混淆
- 对抗异步加载:不使用传统 RESTful API,而是将数据注入到 JSONP 或 WebSocket 中,或者使用 Google 的 protobuf 协议传输,增加解码难度。
- 前端渲染:使用 SSR(服务器端渲染)+ CSR(客户端渲染)混合模式,关键数据通过 JS 异步渲染,或者使用 React/Vue 的 SSR(服务器端渲染)+ 同构 技术,让爬虫难以直接从 HTML 中提取数据。
-
请求签名与加密
- 做法:前端将时间戳、随机数(Nonce)、部分参数进行拼接后,用特定的哈希算法(HMAC-SHA256)生成签名,服务器验证签名有效性。
- 升级(防逆向):将加密逻辑代码进行混淆(Obfuscation)或使用WASM(WebAssembly) 来执行核心加密算法,使反编译成本极高。
-
蜜罐陷阱
- 做法:在页面中放置肉眼看不见(通过 CSS 隐藏、或透明度为 0、或
display:none)的链接或输入框。 - 防护:正常用户点击不到,但爬虫通常不加判断地抓取所有链接,一旦访问了蜜罐地址,直接永久拉黑该 IP 或 Session。
- 做法:在页面中放置肉眼看不见(通过 CSS 隐藏、或透明度为 0、或
-
行为分析与 AI 识别
- 做法:记录鼠标移动轨迹、点击间隔、滚动速度、页面停留时间。
- 防护:机器人的行为(如每分钟稳定请求 30次,鼠标轨迹是完美的直线)与人类不同,使用机器学习模型(如决策树)实时判断并阻断。
第四层:终极防护(法律与策略)
技术无法防御所有情况时,需要配合策略。
-
法律威慑与协议
- 在
robots.txt明确禁止爬取路径(虽无强制力,但构成法律证据)。 - 在网站使用条款中明确禁止商业爬取。
- 对造成严重损失的行为保留证据并提起诉讼。
- 在
-
API 数据水印
在返回的数据中嵌入隐藏的、唯一的用户指纹(如调整不同用户看到的第 200 个字符的颜色略微差异,或修改文本中的空格数量),一旦数据泄露,可以溯源到具体账户。
-
分级请求策略
- 未登录用户:限流极严,只返回少量数据。
- 已登录但未认证:中等权限。
- 已认证(如手机号、身份证):高权限,通过提高拿数据的成本来降低爬虫的收益。
推荐组合方案(最佳实践)
单一的防护很容易被击破,建议按 分层防御 搭建:
- 第一层(入口):使用 WAF(Web应用防火墙) 或 CDN 屏蔽恶意 IP 和低质量代理。
- 第二层(行为):设置 IP 频率限制(如每秒 3次) + 行为验证码(仅在可疑时弹出)。
- 第三层(核心):关键数据接口实现 请求签名 和 数据动态渲染(核心数据通过 JS 计算后渲染,或采用 protobuf)。
- 第四层(兜底):部署 蜜罐链接 和 用户行为分析,封禁异常流量。
重要提醒:任何防护都是有代价的,防护过严会导致正常用户(如下载软件、使用 RSS 阅读器、合法 SEO 采集)也无法访问。防护的目标是让爬虫的成本(时间、金钱)超过其收益,而不是完全杜绝,根据你的网站类型(如电商、资讯、社交)选择适合的 2-3 种方法组合即可。