恶意爬虫和搜索引擎爬虫怎么区分?别误伤SEO

很多站长分不清恶意爬虫和搜索引擎爬虫,要么放任恶意爬虫拖垮服务器,要么一刀切封 UA 把百度、谷歌蜘蛛也拦了,收录直线下跌。本文用问答方式讲清两者的区别、真假蜘蛛的验证方法、Nginx 放行与拦截的实战配置,以及拦截时如何避免误伤 SEO。

Q:恶意爬虫和搜索引擎爬虫到底有什么区别?

两者本质上都是自动化程序,区别在于身份、目的和是否守规矩

  • 搜索引擎爬虫:由百度、Google、必应等官方发出,使用固定 UA(如 Baiduspider、Googlebot),遵守 robots.txt 协议,抓取频率有配额控制,目的是建立搜索索引。
  • 恶意爬虫:目的五花八门——批量采集内容、撞库注册、薅接口数据、扫漏洞、刷量。UA 随便伪造,不读 robots.txt,频率不设上限,还常用代理 IP 池轮换身份。

一句话总结:看身份声明、看抓取行为、看是否遵守协议,三者结合才能下结论,单看任何一条都可能误判。

Q:怎么从 User-Agent 初步判断是不是正常蜘蛛?

主流搜索引擎蜘蛛的 UA 有固定格式,先在 Nginx 日志里统计一遍:

grep -E "Baiduspider|Googlebot|bingbot" /var/log/nginx/access.log \
  | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

正常蜘蛛的抓取路径有规律:优先抓 robots.txt、sitemap 和内页链接,URL 分布分散,频率平稳。恶意爬虫往往集中猛刷同一批 URL,或按列表顺序机械遍历。频率上,百度官方对中小站点有抓取压力配额,如果某个”蜘蛛”每秒几十次请求同一接口,基本可以断定是伪造的。

Q:UA 可以随便伪造,那怎么验证真假蜘蛛?

标准做法是反向 DNS 验证:拿请求 IP 反查域名,再正向解析回 IP,两边对得上才是真蜘蛛。

# 假设请求 IP 是 116.179.32.18(百度蜘蛛常见网段)
host 116.179.32.18
# 返回类似:baiduspider-116-179-32-18.crawl.baidu.com
host baiduspider-116-179-32-18.crawl.baidu.com
# 正向解析出的 IP 必须和请求 IP 完全一致,否则是伪造

Googlebot 对应 .googlebot.com,必应对应 .search.msn.com。日常运维不必逐条验证,把官方蜘蛛网段整理成白名单 IP 列表即可,百度在站长平台公开了蜘蛛网段说明(百度搜索资源平台),可定期下载核对。

Q:robots.txt 能挡住恶意爬虫吗?

挡不住。robots.txt 只是君子协定:正经搜索引擎会遵守并按声明抓取,恶意爬虫根本不会去读,甚至会把 robots.txt 里的 Disallow 路径当成”敏感目录地图”反过来重点抓。所以 robots.txt 该写还是要写,但它只对搜索引擎生效;恶意爬虫必须靠技术手段拦截——限频、UA 黑名单、频率指纹、人机校验,多管齐下。

Q:Nginx 里怎么做到”放行搜索引擎、拦截恶意爬虫”?

思路分两步:先用 map 把 UA 分成三类(蜘蛛、已知恶意、其他),再对”其他”类做限频,”恶意”类直接拒绝。

map $http_user_agent $bot_class {
    default                     normal;
    ~*Baiduspider               spider;
    ~*Googlebot                 spider;
    ~*bingbot                   spider;
    ~*(python-requests|scrapy|HttpClient|Go-http-client|curl) badbot;
}
limit_req_zone $binary_remote_addr zone=bot_req:10m rate=5r/s;

server {
    location / {
        if ($bot_class = badbot) { return 403; }
        if ($bot_class = spider) { limit_req off; }
        limit_req zone=bot_req burst=10 nodelay;
        limit_req_status 429;
        ...;
    }
}

关键点:spider 类不做限频,保住搜索引擎抓取配额;badbot 直接返回 403;普通 UA 走 rate=5r/s 的限频兜底。阈值要按自己业务的正常峰值压测后调整,别照抄。改完先 nginx -t 再 reload。

Q:常见的恶意爬虫都有哪几类?分别怎么拦?

  • 采集爬虫:整站搬运内容,特征是遍历所有列表页和详情页。靠限频 + 频率指纹拦截。
  • 撞库/注册机器人:只打登录、注册、短信接口,特征是 POST 频率异常。靠验证码 + 接口签名拦截。
  • 漏洞扫描器:如 awvs、sqlmap、dirsearch,特征是大量 404 探测路径、带特征 payload。靠 UA/路径特征封禁。
  • 压测型/攻击型:高频打单一接口,本质接近 CC 攻击。靠边缘 WAF + 限频拦截。

类型不同,策略不同:先看日志确认对方是哪类,再对症下药,比无脑全封效果好。

Q:拦截爬虫时怎么避免误伤 SEO?

  • 白名单优先:官方蜘蛛网段先放行,再上拦截规则,顺序不能反。
  • 阈值留余量:限频阈值至少给正常用户留 3~5 倍余量,观察 48 小时日志后再逐步收紧。
  • 返回码讲究:对疑似误伤的请求返回 429 或 503 而不是 403,搜索引擎蜘蛛收到 429/503 会降低抓取频率重试,不会直接删除收录。
  • 盯紧收录:拦截规则上线后,连续两周观察百度站长平台的抓取异常和索引量曲线,掉量立即回滚规则。

Q:还有什么补充建议?

区分和拦截只是第一步,长期建议做三件事:一是把蜘蛛验证脚本化,定期核对日志中蜘蛛 UA 对应的 IP 是否在官方网段,防止伪造蜘蛛长期潜伏;二是给核心接口加上人机校验或签名,让爬虫”看得见、拿不走”;三是如果站点长期被高频爬虫骚扰、自己调 Nginx 的精力有限,直接在服务器前面挂一层带爬虫识别能力的 WAF(如百度云防护),把 UA 指纹、频率分析、JS 挑战交给云端策略执行,源站只处理正常流量,比在源站上不断打补丁省心得多。