SEO 百科
IP 段核对
本页目录
IP 段核对
IP 段核对是把访问网站的那个 IP 地址,与搜索引擎公布的地址列表做比对,落在名单里才判定请求来自该引擎。做 SEO 的人要关心它,因为日志里不少请求自称爬虫,用户代理可以伪造,IP 是另一条独立线索。核对时要对着各家最新公布的名单,名单会随抓取机器扩容而变化。
官方公布的 IP 列表在哪里
Google 把抓取工具的地址范围做成 JSON 文件,放在开发者站点上,机器可以直接下载比对。几个文件按抓取工具的类型分开,常见抓取工具、特殊情况下的抓取工具、用户触发的抓取器各有一份[3]。
Bing 早年说明不公布 IP 段,理由是地址会变,固定名单会让新抓取机器被误挡[1]。后来它提供了一个地址清单文件,形如 https://www.bing.com/toolbox/bingbot.json,文件里按 ipv4Prefix、ipv6Prefix 列出前缀[2]。
百度不提供固定的地址段,只让站长用 DNS 反查核对:主机名以 *.baidu.com 或 *.baidu.jp 结尾,才算百度自己的抓取[4]。
| 引擎 | 名单位置 | 形式 |
|---|---|---|
开发者站点的 ipranges 目录 |
JSON,供程序读取[3] | |
| Bing | bingbot.json |
JSON,按前缀列出[2] |
| 百度 | 不提供名单 | 用 DNS 反查代替[4] |
什么时候需要对照 IP 段
需要核对 IP 的情形大致有三类:
- 给防火墙或 WAF 配置白名单,只放行真爬虫;
- 日志里出现高频抓取,想分清是引擎还是采集程序;
- 真爬虫收到
403,要排查是不是自己封错了地址。
第一种最容易出事。白名单一旦写死,引擎换了新机器,新地址不在名单里,真爬虫就被挡在门外,收录随之减少[1]。白名单要定期从名单文件重新生成,不能一次写好就不再管。
可照抄的核对命令
Google 的名单是 JSON,取回来之后就能用程序判断。下面给出一段 Python 代码,先取回常见抓取工具的地址范围,再判断一个 IP 是否落在其中。
# 取回 Google 常见抓取工具的地址范围,看它的结构
curl -s https://developers.google.com/static/crawling/ipranges/common-crawlers.json | head
import ipaddress, json, urllib.request
URL = "https://developers.google.com/static/crawling/ipranges/common-crawlers.json"
data = json.load(urllib.request.urlopen(URL))
def in_google(ip):
addr = ipaddress.ip_address(ip)
for item in data["prefixes"]:
cidr = item.get("ipv4Prefix") or item.get("ipv6Prefix")
if cidr and addr in ipaddress.ip_network(cidr):
return True
return False
print(in_google("66.249.66.1"))
IPv6 的地址写成 ipv6Prefix,判断时不能只看 ipv4Prefix[3]。只匹配 IPv4 时,走 IPv6 的真爬虫会被判成陌生地址。
常见误用
一个误用是把 IP 段当成唯一标准。地址会被回收和转手,旧名单里的地址可能已经属于他人。IP 段核对要和反向 DNS 核对一起用,两条线索都吻合,才敢放行[1]。
另一个误用是名单长期不更新。名单随抓取机器变化,隔几个月才取一次,中间新增的机器会让真抓取失败。
还有一种误用是只看 IPv4。Google 的名单里同时有 IPv6 前缀,只匹配 IPv4 会漏掉一部分抓取[3]。
最后一种误用是把名单拿来做精确封禁。真正要做的是放行名单内的地址,而不是封禁名单外的所有地址,后者会误伤用户和其他引擎。
附录
参见
参考资料
官方(境外)
- 《How to Verify that Bingbot is Bingbot》,Bing Webmaster Blog,2012-08-31。
- 《bingbot.JSON》,Bing。
- 《Verify requests from Google crawlers and fetchers》,Google 搜索中心,2025 更新。
官方(国内)
- 《Baiduspider》,百度。
外部链接
无。