Skip to content
On this page

站点如何防止爬虫?

  1. 修改 robots.txt
    robots.txt 文件告知遵守该协议的爬虫应该爬取哪些页面,哪些不应该爬取。通常在站点根目录下创建该文件。
    实现方案:

    • 在站点的根目录下创建 robots.txt 文件。
    • 使用 Disallow 指令禁止爬虫访问特定路径,示例:
      User-agent: *
      Disallow: /private/
      Disallow: /secret/
      
      User-agent: *
      Disallow: /private/
      Disallow: /secret/
      
    • robots.txt 只能限制遵守该协议的爬虫,恶意爬虫可以忽视此文件。
  2. 使用 CAPTCHA
    对于表单提交、登录等关键操作使用 CAPTCHA 进行验证,防止自动化脚本提交。
    实现方案:

    • 在登录、注册、评论等表单中集成 CAPTCHA(例如 Google reCAPTCHA)。
    • 验证用户是否为机器人(通过图形识别或行为分析),通过成功验证后才允许提交。
    • 常见的 CAPTCHA 服务有 reCAPTCHA、hCaptcha 等。
  3. 检查用户代理字符串
    通过检查请求头中的 User-Agent 字段来识别并屏蔽一些已知的爬虫。
    实现方案:

    • 在服务器端检查请求的 User-Agent 字符串,确定是否为常见的爬虫(如 Googlebot, Bingbot 等)。
    • 示例:
      javascript
      const userAgent = request.headers["user-agent"];
      if (/bot|crawl|slurp|spider/i.test(userAgent)) {
        response.status(403).send("Forbidden");
      }
      
      const userAgent = request.headers["user-agent"];
      if (/bot|crawl|slurp|spider/i.test(userAgent)) {
        response.status(403).send("Forbidden");
      }
      
    • 注意:用户代理字符串易于伪造,因此此方法不够可靠。
  4. 分析流量行为
    通过监控和分析访问者的行为模式,如访问频率、访问时长等,来识别非正常行为。
    实现方案:

    • 使用日志分析工具(如 Google Analytics 或服务器端日志)监测访问频率、访问路径和停留时间。
    • 如果某个 IP 短时间内请求过于频繁,超过常人行为,可以标记为潜在爬虫,并采取拦截措施。
    • 设定阈值,超过请求次数限制的 IP 可以被临时封禁。
  5. 使用 Web 应用防火墙(WAF)
    WAF 可以有效地识别并阻止常见的爬虫和攻击行为。
    实现方案:

    • 部署 WAF(例如 AWS WAF, Cloudflare WAF)来过滤掉来自恶意爬虫的请求。
    • 配置规则来检测并阻止针对特定页面、IP 或请求频率的异常流量。
    • 一些 WAF 提供机器人检测和阻止功能,能够自动识别常见的爬虫行为。
  6. 服务端渲染和动态 Token
    通过服务端渲染和动态生成令牌,防止非浏览器工具获取页面内容。
    实现方案:

    • 使用 JavaScript 服务端渲染(SSR)技术,在服务器端生成 HTML,并注入动态内容。
    • 将页面关键内容如令牌或验证码动态插入到 HTML 中,而不是将静态内容直接嵌入页面。
    • 每次请求时生成唯一的 token,爬虫无法获取正确的 token,防止内容被抓取。
  7. 添加额外的 HTTP 头
    在每个请求中添加特定的 HTTP 头,这些头部信息通常是由 JavaScript 动态生成的,爬虫工具可能不会模拟这些行为。
    实现方案:

    • 在站点响应头中加入自定义 HTTP 头(如 X-Custom-Header),并在请求中验证其值。
    • 示例:
      javascript
      // 在服务器端验证请求头
      if (request.headers["X-Custom-Header"] !== "expected_value") {
        return response.status(403).send("Forbidden");
      }
      
      // 在服务器端验证请求头
      if (request.headers["X-Custom-Header"] !== "expected_value") {
        return response.status(403).send("Forbidden");
      }
      
    • 通过 JavaScript 动态添加这些头信息,爬虫通常无法正确模拟请求头。
  8. IP 黑名单
    如果发现某个 IP 地址表现出异常访问行为(如访问频繁、无效请求等),将其列入黑名单。
    实现方案:

    • 监控访问日志,识别异常 IP(如请求频率过高的 IP)。
    • 使用反向代理或防火墙工具(如 Nginx, HAProxy)拦截特定 IP 地址的访问。
    • 示例:
      nginx
      if ($remote_addr = "123.123.123.123") {
        return 403;
      }
      
      if ($remote_addr = "123.123.123.123") {
        return 403;
      }
      
    • 这样可以有效阻止恶意爬虫继续访问网站。
  9. 限制访问速度
    对访问进行速率限制,禁止过于频繁的请求。
    实现方案:

    • 设置速率限制(例如每分钟请求次数),对于超过阈值的请求,返回 429 错误(Too Many Requests)。
    • 使用工具如 Nginx 限制请求速率:
      nginx
      limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
      limit_req zone=one burst=5;
      
      limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
      limit_req zone=one burst=5;
      
    • 这能有效限制爬虫对页面的快速抓取。
  10. API 限流
    针对开放的 API,设置访问频率限制,防止恶意爬虫大量访问接口。
    实现方案:

    • 在服务器端实现 API 限速(如每个用户每分钟请求次数限制)。
    • 使用 Redis 或数据库记录每个用户的请求时间,并根据请求次数进行限制。
    • 示例:
      javascript
      const rateLimiter = new RateLimiter({ max: 100, window: 60 });
      if (!rateLimiter.allowRequest(userId)) {
        response.status(429).send("Too many requests");
      }
      
      const rateLimiter = new RateLimiter({ max: 100, window: 60 });
      if (!rateLimiter.allowRequest(userId)) {
        response.status(429).send("Too many requests");
      }
      
  11. 使用 HTTPS
    HTTPS 加密协议不仅能提升安全性,还能增加爬虫抓取的难度。
    实现方案:

    • 在站点上启用 HTTPS,通过 SSL/TLS 加密所有通信。
    • 确保所有的请求都通过 HTTPS 访问,避免 HTTP 中间人攻击。
    • 使用免费的 SSL 证书(如 Let’s Encrypt)或者付费证书来保障网站的安全性。
  12. 更改网站结构和内容
    定期更新网站的 URL 结构、内容排版等,迫使爬虫更新其抓取策略。
    实现方案:

    • 定期重构网站的目录结构和 URL 路径,改变页面的布局和元素的 DOM 结构。
    • 将一些敏感内容使用动态加载的方式呈现,爬虫难以抓取。

通过这些方法,可以有效增加爬虫抓取网站内容的难度,保护站点免受恶意抓取。