⭐ 推荐:社区规则条款 V1.0

如何按 IP 段识别真假蜘蛛爬虫?

chinaz
chinaz 初级会员超兽战士
发布于 2026-10-11 21:19 ·10 浏览 ·0 回复
内容摘要

介绍通过获取真实来访 IP、反向 DNS 解析、正向解析确认及比对官方 IP 段来识别真假蜘蛛爬虫的流程,以区分真爬虫与伪造 UA、XFF 的采集器。

学完这篇,你能拿到一套可落地的判断流程:把「自称百度蜘蛛/Googlebot」的请求挨个过一遍,分清哪些是真爬虫、哪些是套着 UA 伪装来扒站的采集器。

第一步:先拿到真实来访 IP

这一步要解决的是「到底该拿哪个 IP 去判断」。如果你站点前面有 Nginx、CDN 或负载均衡,X-Forwarded-For 是可以被客户端随意伪造的,直接用它判断必然出错。

  • 直连场景:用 $remote_addr。
  • 经过一层可信代理(如自家 Nginx):用 $http_x_forwarded_for 里从右往左数第一个不属于你内网的地址,或让代理层写 X-Real-IP。
  • 用的是 Cloudflare/阿里云 CDN:优先读 CF-Connecting-IP、Ali-CDN-Real-IP,并且要在 Nginx 里用 set_real_ip_from 声明回源段。

注意:如果你的 Nginx 没配置 set_real_ip_from 就启用了 real_ip_header X-Forwarded-For,攻击者发一个假 XFF 就能让日志里的 IP 全是假的,后面所有判断都白做。

第二步:做反向 DNS 解析,看域名后缀

拿到 IP 后,先反查 PTR 记录,看它挂在谁的域名下。以 Linux 为例:

dig -x 66.249.66.1 +short

真蜘蛛的 PTR 有固定命名规律:Googlebot 是 *.googlebot.com 或 *.google.com,Bing 是 *.search.msn.com,百度是 *.crawl.baidu.com,Yandex 是 *.yandex.ru/*.yandex.net。

没有 PTR 记录、或者 PTR 指向某个虚拟主机商域名的,基本可以直接判定为假。

注意:PTR 记录是 IP 所有者自己配的,任何人租个 VPS 都能把 PTR 改成 crawl-1-2-3-4.googlebot.com,所以单看 PTR 不够,必须做下一步。

第三步:正向解析确认(FCrDNS)

把第二步得到的域名再解析回 IP,看是否和原始 IP 一致。一致才叫「正向确认的反向解析」,这是防伪造的核心。

dig +short crawl-66-249-66-1.googlebot.com
# 必须能解析出 66.249.66.1,否则是伪造

第四步:和官方公布的 IP 段做比对

前三步过了,再拿 IP 去比对官方段,这一步是最终确认。官方 JSON/文本列表如下:

爬虫官方地址
Googlebothttps://developers.google.com/search/apis/ipranges/googlebot.json
Bingbothttps://www.bing.com/toolbox/bingbot.json
Baiduspider百度搜索资源平台(ziyuan.baidu.com)搜「如何识别 Baiduspider」文档,内有 IP 段清单
360Spider/Sogou各自站长平台公布,无公开 JSON 的按 PTR 后缀 + ASN 判断

用 Python 判断很简单,不用手写字符串匹配:

import ipaddress
nets = [ipaddress.ip_network("66.249.64.0/19")]  # 换成官方最新段
print(any(ipaddress.ip_address("66.249.66.1") in n for n in nets))

第五步:查 ASN 兜底

如果官方没给段,就查 IP 归属的自治域。Google 是 AS15169,Microsoft/Bing 是 AS8075,百度是 AS55967、AS38365。命令:

whois -h whois.cymru.com " -v 66.249.66.1"

ASN 对不上,一律当假蜘蛛处理。

第六步:写成线上规则

把上面逻辑固化成脚本,每天定时拉一次官方 JSON 更新本地段列表,再在 Nginx 里用 geo 模块做快速判断:

geo $is_real_spider {
    default 0;
    include /etc/nginx/spider_ips.conf;  # 内容形如 66.249.64.0/19 1;
}

然后在 server 块里:UA 含 Spider 但 $is_real_spider = 0 的请求,直接 return 403;真蜘蛛走正常限速;伪蜘蛛还可以顺手记一条日志用于封 IP。

注意:IP 段会变,别把列表写死在代码里。至少每周更新一次,否则新段上的真蜘蛛会被你误封,收录受影响。

小结

  • 判断依据是 IP,不是 UA——UA 一行字就能伪造。
  • 三步走:PTR 反查 → 正向确认(FCrDNS)→ 比对官方段/ASN,三步全过才算真。
  • 有 CDN 或代理时,先确保日志里的 IP 是真实的,否则后面全错。
  • 官方 IP 列表要定时自动更新,写死会误伤真爬虫。
  • 伪蜘蛛的处理方式建议「403 + 记录」,不要直接封整个 C 段,避免误伤同机房正常用户。
版权声明:本文来自 GJ站长论坛《如何按 IP 段识别真假蜘蛛爬虫?》
原文链接:https://www.gj0.com/thread-1669.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。
他们都看过 1 人浏览过
GJ论坛站长

全部回复 0

还没有回复,来抢沙发~