本文目录导读:

基础防护(入口拦截)
-
User-Agent 验证
检查请求头的User-Agent字段,拒绝不常见或明显爬虫的UA(如python-requests、Scrapy)。
注意:恶意爬虫可伪造UA,仅作辅助手段。 -
IP 访问频率限制
- 统计单个IP的请求频率(如每分钟100次),超过则临时封禁(返回403或验证码)。
- 使用 Redis +令牌桶或滑动窗口算法实现。
-
验证码
- 对高频访问、敏感操作(登录、注册)提示验证码(图形/滑块/点选)。
- 推荐集成
Google reCAPTCHA或极验。
行为特征检测
-
请求间隔与模式
- 检测请求时间是否均匀(如每秒n次),正常用户存在随机间隔。
- 监控会话(Session)内访问页面路径是否符合逻辑(如先首页→详情页,而非直接大量详情页)。
-
Cookie 与 JS 验证
- 首次请求时设置临时Cookie,要求客户端执行JS生成校验参数(如
TikTok的_signature)。 - 使用
JS Challenge(如 Cloudflare 的5秒盾),需浏览器执行JS后才能获取真实页面。
- 首次请求时设置临时Cookie,要求客户端执行JS生成校验参数(如
-
表单隐藏字段
表单添加非显示字段(如username),通过CSS/JS隐藏,正常用户不会提交,爬虫可能自动填充。
进阶对抗技术
-
动态页面加载
- 核心数据通过异步接口(AJAX/WebSocket)动态获取,并绑定时间戳或一次性Token。
- 使用
WebDriver检测:检查navigator.webdriver等属性。
-
字体/图片混淆
- 敏感文字(如价格)替换为自定义字体或图片,阻止OCR简单的识别。
- 电话号码、邮箱等用Base64编码后JS解码显示。
-
请求签名校验
对请求参数(URL、时间戳、用户标识)进行HMAC签名,服务端验证有效性(类似淘宝、抖音的_s参数)。 -
蜜罐陷阱
在CSS中隐藏对爬虫可见但用户不可见的链接(如<a href="/honeypot" style="display:none">),访问即封IP。
法律与伦理规范
- 遵守
robots.txt:禁止爬虫访问非公开目录。 - 标识反爬规则:在页面注明禁止非授权爬取,或要求申请API Key。
- 异常流量监控:对明显爬虫(如大量无效UA、IP来自数据中心)返回假数据而非封禁,消耗其解析资源。
工具与平台
- Cloudflare:提供
Bot Fight Mode、WAF、JS Challenge。 - 阿里云/腾讯云WAF:支持自定义频率限制、IP黑名单。
- Nginx + Lua:通过
access_by_lua实现动态封IP。
注意事项
- 误伤正常用户:对搜索引擎(Googlebot、Bingbot)需放宽限制,通过DNS反向解析验证其身份。
- 性能影响:频繁的JS验证或动态加载会增加服务器负载,需做缓存。
- 法律风险:过度反爬可能影响网站可访问性,需平衡安全与用户体验。
示例代码(Python Flask + Redis频率限制)
from flask import Flask, request, jsonify
import redis
import time
app = Flask(__name__)
r = redis.Redis(host='localhost', port=6379, db=0)
@app.before_request
def limit_requests():
ip = request.remote_addr
key = f"rate_limit:{ip}"
count = r.get(key)
if count and int(count) > 100:
return jsonify({"error": "Too many requests"}), 429
pipe = r.pipeline()
pipe.incr(key)
pipe.expire(key, 60)
pipe.execute()