一、前端防护(阻断低级爬虫)
1. 验证码(CAPTCHA)
• Google reCAPTCHA v3(无感验证):
html
<!-- 前端嵌入 -->
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
<!-- 后端校验(Node.js示例) -->
app.post('/submit', async (req, res) => {
const token = req.body['g-recaptcha-response'];
const verifyUrl = `https://www.google.com/recaptcha/api/siteverify?secret=YOUR_SECRET_KEY&response=${token}`;
const response = await axios.post(verifyUrl);
if (response.data.success) {
// 处理合法请求
} else {
res.status(403).send('Invalid CAPTCHA');
}
});
2. 行为检测
• 检测用户是否执行了必要操作(如滚动、点击):
javascript
// 前端:记录用户操作时间戳
let lastInteraction = Date.now();
window.addEventListener('mousemove', () => {
lastInteraction = Date.now();
});
// 后端校验(Python Flask示例)
if (req.headers['x-last-interaction'] < Date.now() - 30000) {
return 'Session expired', 403;
}
3. Honeypot 隐藏字段
• 在表单中添加不可见输入框,爬虫通常会误填:
html
<form action="/submit" method="post">
<input type="text" name="username" required>
<input type="hidden" name="honeypot" value="">
<button type="submit">提交</button>
</form>
// 后端校验(PHP示例)
if (!empty($_POST['honeypot'])) {
header('HTTP/1.1 403 Forbidden');
exit();
}
二、后端防护(核心防御层)
1. 请求频率限制(Rate Limiting)
• 基于 IP 的限流(Nginx 示例):
nginx
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=5r/s;
location /api/ {
limit_req zone=ip_limit;
}
• 基于 User-Agent 的限流 (Express.js + express-rate-limit
):
javascript
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: 100, // 每个IP每15分钟最多100次请求
key: (req) => req.headers['user-agent']
});
app.use('/api', apiLimiter);
2. 动态令牌验证
• 为每个请求生成唯一令牌(如 CSRF Token),并在服务端校验:
javascript
// 前端:Token注入到请求头
axios.defaults.headers.common['X-CSRF-TOKEN'] = sessionStorage.getItem('csrfToken');
// 后端校验(Spring Boot示例)
@PostMapping("/submit")
public ResponseEntity<?> submit(@RequestHeader("X-CSRF-TOKEN") String token) {
if (!csrfTokenRepository.validateToken(token)) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid CSRF Token");
}
// 处理请求
}
3. 参数合法性校验
• 防止爬虫篡改关键参数(如订单号、价格):
python
# Django 中间件示例
class ParamValidatorMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
order_id = request.GET.get('order_id')
if not re.match(r'^\d{10}$', order_id):
return HttpResponseBadRequest("Invalid Order ID")
return self.get_response(request)
三、网络层防护(拦截恶意流量)
1. Web 应用防火墙(WAF)
• Cloudflare 配置规则:
yaml
rules:
- type: rate_limiting
threshold: 100
period: 1m
action: block
- type: ip_blocklist
ip_list: ["123.123.123.0/24"]
• ModSecurity(Apache/Nginx)规则示例:
apache
SecRule REQUEST_HEADERS:User-Agent "bot|crawler" \
id:900001 \
phase:2 \
t:none \
nolog \
block
2. CDN 层流量清洗
• 使用 Cloudflare Workers 编写自定义反爬虫逻辑:
javascript
// Workers 脚本示例:拦截高频访问IP
addEventListener('fetch', (event) => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const ip = request.headers.get('CF-Connecting-IP');
const count = await redis.get(ip);
if (count && parseInt(count) > 100) {
return new Response('Too many requests', { status: 429 });
}
// 更新计数并继续处理请求
redis.set(ip, parseInt(count) + 1, 'EX', 3600);
return fetch(request);
}
四、数据层防护(保护核心资源)
1. 数据库权限控制
• ClickHouse 示例:仅允许特定 IP 访问敏感表:
sql
CREATE USER clickhouse_user WITH PASSWORD 'password';
GRANT SELECT ON database_name.table_name TO clickhouse_user FROM IP 192.168.1.0/24;
2. API 接口鉴权
• 使用 HMAC 签名验证请求合法性(Node.js 示例):
javascript
// 生成签名
const crypto = require('crypto');
function generateSignature(secret, data) {
return crypto.createHmac('sha256', secret).update(data).digest('hex');
}
// 客户端请求示例
const signature = generateSignature('my-secret-key', JSON.stringify(params));
fetch('/api', {
headers: {
'Authorization': `Bearer ${signature}`
}
});
// 服务端校验
app.use((req, res, next) => {
const clientSignature = req.headers.authorization.replace('Bearer ', '');
const serverSignature = generateSignature('my-secret-key', req.body);
if (clientSignature !== serverSignature) {
return res.status(401).send('Invalid Signature');
}
next();
});
五、高级反爬虫策略
1. 分布式封禁系统
• 使用 Redis 或 Memcached 记录恶意 IP,并联动防火墙封禁:
python
# 封禁 IP 至防火墙(示例)
def ban_ip(ip):
redis_client.set(f'blocked_ip:{ip}', 3600) # 封禁1小时
subprocess.run(['iptables', '-A', 'INPUT', '-s', ip, '-j', 'DROP'])
2. 页面渲染混淆
• 动态生成页面元素(如商品价格、验证码),增加爬虫解析难度:
javascript
// 前端动态加载价格
setTimeout(() => {
document.getElementById('price').textContent = Math.random().toFixed(2) * 100;
}, 1000);
3. 机器学习模型
• 使用 Scikit-learn 或 TensorFlow 构建异常流量检测模型:
python
# 伪代码:基于请求特征的异常检测
from sklearn.ensemble import IsolationForest
model = IsolationForest(contamination=0.05)
model.fit(normal_traffic_samples)
predictions = model.predict(scraped_requests)
六、实战案例
案例1:电商网站防爬虫
• 问题 :商品详情页被批量爬取。 • 方案:
- 前端:动态加载页面内容(需 JavaScript 解析)。
- 后端:对同一 IP 的高频访问返回 429 错误。
- 数据库:对商品价格字段添加读写权限控制。
案例2:新闻聚合平台反爬虫
• 问题 :API 接口被高频调用。 • 方案:
- Nginx 层配置限流规则(每秒 10 次请求)。
- 后端校验 Referer 头部是否来自合法域名。
- 对敏感接口启用 HMAC 签名验证。
七、工具链推荐
工具类型 | 推荐工具 | 用途 |
---|---|---|
限流工具 | express-rate-limit (Node.js) |
控制 API 请求频率 |
验证码服务 | hCAPTCHA |
轻量级无感验证 |
日志分析 | ELK Stack(Elasticsearch + Logstash + Kibana) | 分析异常请求模式 |
分布式封禁 | Redis + iptables |
实时封禁恶意 IP |
八、注意事项
- 用户体验:验证码和限流策略需尽可能减少对正常用户的影响。
- 性能优化:限流和数据库查询需通过缓存(如 Redis)降低计算开销。
- 法律合规 :禁止封禁合法爬虫(如搜索引擎机器人),可通过
robots.txt
明确声明。
通过以上措施,开发者可以有效抵御大部分爬虫攻击,同时保障网站的高可用性和数据安全性。