Skip to content

反爬虫的种类

1. 基于用户行为的反爬虫

  • 访问频率限制: 检测单位时间内的请求次数,超过阈值则封禁IP
  • 行为模式分析: 分析用户的点击、滚动、停留时间等行为特征,识别机器行为
  • 验证码: 在关键操作时要求用户完成验证码验证(图片验证码、滑块验证、行为验证等)

2. 基于请求特征的反爬虫

  • User-Agent检测: 检查请求头中的User-Agent,过滤非正常浏览器请求
  • Referer检测: 验证请求来源,确保请求来自合法页面
  • Cookie验证: 要求客户端支持Cookie,检测是否携带特定Cookie
  • 请求头完整性: 检查请求头是否包含浏览器的标准字段

3. 动态内容加载

  • JavaScript渲染: 使用JavaScript动态生成页面内容,爬虫需要执行JS才能获取数据
  • 异步加载: 通过AJAX请求加载数据,增加爬取难度
  • WebSocket: 使用WebSocket协议传输数据

4. 内容保护技术

  • 字体反爬: 使用自定义字体文件,将文字映射到不同的Unicode编码
  • CSS偏移: 使用CSS将元素打乱顺序显示,实际DOM结构与显示不一致
  • 图片化: 将文字内容转换为图片展示
  • Canvas指纹: 利用Canvas生成唯一设备指纹识别

5. 数据加密

  • 参数加密: 对请求参数进行加密,需要逆向算法才能构造请求
  • 响应数据加密: 对返回的数据进行加密,需要解密才能使用
  • Token机制: 使用动态生成的Token验证请求合法性

6. 蜜罐技术

  • 隐藏链接: 在页面中放置普通用户看不到但爬虫会访问的链接
  • 诱饵数据: 插入虚假数据来识别和追踪爬虫

如何实现反爬虫

基础实现方案

  1. IP限流使用Redis等缓存工具记录IP访问次数:

    python
    import redis
    from flask import request, abort
    
    r = redis.Redis(host='localhost', port=6379)
    
    def check_rate_limit():
        ip = request.remote_addr
        key = f"rate_limit:{ip}"
        count = r.incr(key)
        
        if count == 1:
            r.expire(key, 60)  # 60秒过期
        
        if count > 100:  # 每分钟最多100次请求
            abort(429)  # Too Many Requests
  2. User-Agent验证

    python
    from flask import request, abort
    
    ALLOWED_USER_AGENTS = ['Mozilla', 'Chrome', 'Safari', 'Edge']
    
    def check_user_agent():
        user_agent = request.headers.get('User-Agent', '')
        if not any(agent in user_agent for agent in ALLOWED_USER_AGENTS):
            abort(403)
  3. 验证码集成集成Google reCAPTCHA或其他验证码服务:

    python
    import requests
    from flask import request, jsonify
    
    def verify_captcha(token):
        secret_key = "your_secret_key"
        verify_url = "https://www.google.com/recaptcha/api/siteverify"
        
        response = requests.post(verify_url, data={
            'secret': secret_key,
            'response': token
        })
        
        result = response.json()
        return result.get('success', False)
  4. 动态Token生成

    python
    import hashlib
    import time
    from flask import session
    
    def generate_token():
        timestamp = str(int(time.time()))
        secret = "your_secret_key"
        token = hashlib.sha256(f"{timestamp}{secret}".encode()).hexdigest()
        session['token'] = token
        session['timestamp'] = timestamp
        return token
    
    def verify_token(token):
        stored_token = session.get('token')
        stored_timestamp = session.get('timestamp')
        
        # 检查token是否匹配且未过期(5分钟有效期)
        if token == stored_token and int(time.time()) - int(stored_timestamp) < 300:
            return True
        return False
  5. JavaScript混淆和动态渲染使用JavaScript混淆工具保护前端代码,并动态生成关键参数:

    jsx
    // 动态生成请求参数
    function generateRequestParams() {
        const timestamp = Date.now();
        const nonce = Math.random().toString(36).substring(7);
        const signature = CryptoJS.SHA256(timestamp + nonce + SECRET_KEY).toString();
        
        return {
            timestamp: timestamp,
            nonce: nonce,
            signature: signature
        };
    }

高级实现方案

  1. 设备指纹识别使用Canvas、WebGL、AudioContext等技术生成设备指纹:

    jsx
    async function generateFingerprint() {
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');
        ctx.textBaseline = 'top';
        ctx.font = '14px Arial';
        ctx.fillText('fingerprint', 2, 2);
        
        const canvasData = canvas.toDataURL();
        const fingerprint = await crypto.subtle.digest('SHA-256', 
            new TextEncoder().encode(canvasData + navigator.userAgent));
        
        return Array.from(new Uint8Array(fingerprint))
            .map(b => b.toString(16).padStart(2, '0'))
            .join('');
    }
  2. 行为分析系统记录和分析用户行为模式:

    python
    class BehaviorAnalyzer:
        def __init__(self):
            self.mouse_movements = []
            self.click_intervals = []
            self.scroll_patterns = []
        
        def analyze(self, user_data):
            score = 0
            
            # 分析鼠标移动的平滑度
            if self.is_smooth_movement(user_data['mouse']):
                score += 30
            
            # 分析点击间隔的随机性
            if self.is_random_intervals(user_data['clicks']):
                score += 30
            
            # 分析滚动行为
            if self.is_natural_scroll(user_data['scroll']):
                score += 40
            
            return score > 60  # 60分以上判定为人类
  3. 分布式反爬架构结合多种技术构建完整的反爬虫系统:

    • 前端:设备指纹、行为采集、验证码
    • 网关层:IP限流、User-Agent过滤、地理位置验证
    • 应用层:Token验证、参数加密、业务逻辑检测
    • 数据层:访问日志分析、机器学习模型识别

注意事项

  • 反爬虫策略需要平衡安全性和用户体验
  • 定期更新反爬虫策略,应对不断进化的爬虫技术
  • 遵守相关法律法规,合理使用反爬虫技术
  • 为合法爬虫(如搜索引擎)提供robots.txt指引
  • 建立监控和告警机制,及时发现异常流量

HTTP Headers 风控分析与规避策略

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.7.1