如何按 IP 段识别真假蜘蛛爬虫?
介绍通过获取真实来访 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/文本列表如下:
| 爬虫 | 官方地址 |
|---|---|
| Googlebot | https://developers.google.com/search/apis/ipranges/googlebot.json |
| Bingbot | https://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 段,避免误伤同机房正常用户。
原文链接:https://www.gj0.com/thread-1669.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。