爬虫识别与封禁,区分搜索引擎爬虫:爬虫识别与封禁
网站流量异常、CPU 飙升时,很多站长第一反应是直接封 IP 段,结果误伤了百度、谷歌等正常收录爬虫。
本文面向零基础站长,讲清如何从日志和请求特征中识别爬虫,并用 Nginx 和宝塔面板实现「放行搜索引擎爬虫、封禁恶意抓取」的分流策略。
先判断抓取来源,别急着封 IP
搜索引擎爬虫和恶意爬虫在行为上有明显区别。
正规搜索引擎爬虫通常有固定的 User-Agent 标识,并且会通过官方公开的 IP 段发起请求;
恶意爬虫则常伪装 UA、高频请求、不遵守 robots.txt。
判断一个 IP 是否属于搜索引擎,最稳妥的方式是反查 IP 归属,而不是只看 User-Agent。
以百度为例,可以在服务器上执行:
host 220.181.108.1
如果返回结果中包含 baidu.com 这类官方域名后缀,才说明该 IP 确实来自百度。
谷歌、必应也提供类似的公开验证方式,建议以各搜索引擎官方文档中公布的反查规则为准。
只看 User-Agent 就放行是不安全的,因为恶意爬虫可以随意伪造 UA。
反过来,直接封整个 C 段也可能把正常用户一起挡掉。
用日志筛出真正的高频请求者
在动手配置之前,先通过访问日志确认是谁在频繁抓取。
宝塔面板中日志路径一般在 /www/wwwlogs/你的域名.log,命令行可以直接统计:
awk '{print $1}' /www/wwwlogs/example.com.log | sort | uniq -c | sort -rn | head -20
输出结果里,请求次数明显偏高的 IP 就是重点排查对象。
再结合 UA 看它们是否伪装成浏览器:
awk '{print $1, $12}' /www/wwwlogs/example.com.log | sort | uniq -c | sort -rn | head -20
如果一个 IP 请求量很高,但 UA 是空值、python-requests、curl 或与已知搜索引擎不符,基本可以判定为恶意抓取。这一步是后续封禁策略的数据基础,不要跳过。
Nginx 中放行搜索引擎爬虫并封禁恶意 IP
确认了恶意 IP 后,在 Nginx 站点配置中做区分处理。
思路是:优先放行已验证的搜索引擎 IP 段,再对恶意 IP 返回 403。
在宝塔面板中进入「网站」→ 找到对应站点 →「配置文件」,在 server {} 块内加入:
# 放行百度、谷歌等搜索引擎爬虫 IP 段
allow 220.181.108.0/24;
allow 66.249.64.0/19;
# 封禁确认的恶意 IP
deny 203.0.113.50;
deny 198.51.100.0/24;
保存后在宝塔面板重载 Nginx,或执行:
nginx -t && nginx -s reload
nginx -t 返回 syntax is ok 和 test is successful 才算配置正确。allow 规则要写在 deny 前面,
否则封禁规则会先命中,
放行就失效了。
配置时容易踩的几个坑
第一个坑是顺序写反。
Nginx 的 allow/deny 按从上到下匹配,先命中的规则生效,所以放行搜索引擎的 allow 必须放在前面。
第二个坑是封禁粒度太粗。
直接封一个 B 段可能影响同机房的其他正常用户,建议先封单个 IP,观察效果再决定是否扩大到 C 段。
第三个坑是忽略 robots.txt。
对合规爬虫,可以在 robots.txt 中声明抓取频率,例如:
User-agent: *
Crawl-delay: 10
Disallow: /admin/
这不能挡住恶意爬虫,但能减少正常爬虫对服务器的压力。
第四个坑是封禁后不复查。
封禁生效后应持续观察日志,确认目标 IP 请求量下降,同时搜索引擎抓取量没有异常下跌。
验证封禁效果
配置完成后,用以下方式验证:
- 在日志中确认被 deny 的 IP 返回状态码变为
403:grep '403' /www/wwwlogs/example.com.log | tail -20 - 观察服务器 CPU 和带宽是否回落,可用
top或宝塔面板的监控图表查看 - 登录百度搜索资源平台,检查抓取频次和收录量是否正常
如果发现搜索引擎抓取量明显下降,应立刻检查 allow 列表是否遗漏了官方 IP 段,建议以搜索引擎官方公布的 IP 段为准进行核对。
常见疑问
Q:只靠 User-Agent 判断爬虫可以吗?
不建议。UA 可以被伪造,必须结合 IP 反查结果一起判断。
Q:封禁 IP 后需要保留多久?
没有固定期限。建议先封禁并持续观察,如果该 IP 不再发起请求,可以保留规则;如果误封,及时移除。
Q:搜索引擎爬虫会不会被误封?
只要 allow 列表正确包含官方 IP 段,并且顺序在 deny 之前,就不会被误封。建议定期核对官方公布的 IP 段是否有更新。
区分搜索引擎爬虫和恶意抓取的核心,是先通过日志和 IP 反查确认身份,再用 Nginx 的 allow/deny 规则做精细化放行与封禁。
按本文步骤执行后,你可以在不影响正常收录的前提下,有效降低恶意爬虫对服务器资源的消耗。