网站被大量爬虫访问的真实排查过程:User-Agent、IP频率与robots策略记录
今天检查网站日志的时候,发现一个比较明显的异常:网站访问量突然多了不少,但从后台数据来看,并不像是真实用户访问。
页面访问看起来正常,网站没有直接打不开,但是服务器连接数比平时高,带宽也有小幅上涨。刚开始我以为是文章收录后带来的自然访问,后来仔细看日志才发现,其中有一部分访问并不是正常用户,而是大量爬虫请求。
爬虫访问这个问题不能简单处理。
如果全部拦截,可能会误伤搜索引擎蜘蛛,影响网站收录。
如果完全不管,又可能导致服务器资源被无效请求消耗。
所以这次我没有直接封IP,而是从 User-Agent、IP访问频率、请求路径和 robots 策略几个方向一步一步排查。
一、问题出现时的表现
这次问题的表现主要有几个:
网站可以正常打开。
服务器没有宕机。
CPU没有持续100%。
但是连接数比平时高。
访问日志增长速度明显变快。
部分页面偶尔加载变慢。
后台统计看不到明显真实转化。
从这些表现来看,网站不是被打崩了,但访问量确实异常增加。
这种情况最容易让人误判为“网站流量变好了”。
但实际流量有没有价值,要看访问来源和行为。
如果大量请求都是爬虫、采集器、扫描器,反而会给服务器带来压力。
二、第一步:先查看服务器连接情况
我先登录服务器查看连接数量。
netstat -an | wc -l
然后重点查看已经建立的连接:
netstat -an | grep ESTABLISHED | wc -l
连接数比平时偏高,但还没有达到服务器崩溃的程度。
接着查看当前系统状态:
top
CPU和内存没有明显爆满。
这说明当前问题还处于可控范围内,但如果不处理,后面可能会逐渐拖慢网站。
三、第二步:分析访问日志里的IP频率
爬虫访问是否异常,最直接的办法就是看访问日志。
我先统计访问次数最多的IP:
awk '{print $1}' /www/wwwlogs/access.log | sort | uniq -c | sort -nr | head
结果发现,前几个IP的请求次数明显高于普通用户。
正常用户访问网站,一般不会在短时间内连续请求几百上千次。
如果某个IP短时间内访问非常频繁,就要重点分析它到底在请求什么。
四、第三步:查看这些IP访问了哪些页面
只看IP次数还不够,因为搜索引擎蜘蛛也可能访问很多页面。
所以我继续查看高频IP访问的URL。
grep "异常IP" /www/wwwlogs/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head
结果发现部分IP访问路径比较异常。
比如:
频繁访问不存在的路径。
大量请求搜索页。
不停翻页抓取文章列表。
访问一些明显不是正常用户会打开的目录。
还有一些请求带着奇怪参数。
这种访问行为就不像正常用户,更像采集器或者扫描器。
五、第四步:查看User-Agent信息
继续查看这些请求的 User-Agent。
grep "异常IP" /www/wwwlogs/access.log | awk -F\" '{print $6}' | sort | uniq -c | sort -nr | head
这里可以看到访问者声明的客户端信息。
有些 User-Agent 写得很明显,比如普通浏览器、搜索引擎蜘蛛、采集工具等。
但这里要注意一点:
User-Agent 是可以伪造的。
不是写着 Baiduspider 就一定是真的百度蜘蛛。
也不是写着 Chrome 就一定是真实用户。
所以不能只靠 User-Agent 判断,还要结合IP来源、访问频率和访问路径一起看。
六、第五步:区分正常蜘蛛和异常爬虫
对网站来说,搜索引擎蜘蛛不是坏事。
百度、必应、搜狗等正常蜘蛛抓取网站内容,有助于收录和更新快照。
但异常爬虫就不一样了。
正常蜘蛛通常有几个特点:
访问有一定规律。
不会短时间疯狂请求接口。
不会大量访问后台路径。
不会反复请求不存在的页面。
抓取频率相对可控。
异常爬虫通常表现为:
短时间请求频率很高。
不停翻页抓取。
大量访问搜索结果页。
访问不存在目录。
请求带有奇怪参数。
User-Agent混乱或频繁变化。
这次排查中,我发现有一部分是正常搜索引擎蜘蛛,还有一部分更像采集器。
所以处理时不能一刀切。
七、第六步:检查是否存在大量404请求
很多异常爬虫会扫描不存在的路径。
我统计了一下404请求。
grep " 404 " /www/wwwlogs/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head
结果发现部分IP产生了大量404。
这类请求对网站没有任何价值,还会增加服务器日志和处理压力。
如果一个IP一直请求不存在路径,基本可以判断为异常扫描或无效爬虫。
这类IP可以考虑限制或封禁。
八、第七步:检查是否爬取了后台和敏感路径
我又检查了是否有爬虫访问后台路径、登录入口或敏感文件。
grep -E "admin|login|wp-login|phpmyadmin|\.env" /www/wwwlogs/access.log | head
结果发现确实有部分请求在尝试访问常见后台路径。
这类访问基本不是正常用户,也不是正常搜索引擎蜘蛛。
比如:
wp-login.php
phpmyadmin
.env
admin
backup
这些路径如果网站本身并不存在,说明对方很可能是在批量扫描。
这种请求不仅浪费资源,还可能带来安全风险。
九、问题真正原因
排查到这里,问题基本清楚了。
这次网站访问量上涨,不完全是真实用户访问。
其中一部分来自正常搜索引擎蜘蛛。
一部分来自采集型爬虫。
还有一部分来自扫描器请求。
这些请求叠加后,导致:
访问日志增长很快。
连接数上升。
带宽有小幅增加。
部分页面偶尔变慢。
服务器虽然没有崩,但资源确实被无效请求占用了一部分。
所以这次问题不是单纯的攻击,也不是纯粹的正常流量,而是正常蜘蛛和异常爬虫混在一起造成的。
十、实际处理过程
确认原因后,我没有直接全站封禁,而是分情况处理。
1. 保留正常搜索引擎蜘蛛
对正常蜘蛛不做强拦截,避免影响网站收录。
尤其是百度蜘蛛、必应蜘蛛这类对网站收录有帮助的访问,需要谨慎处理。
但如果频率异常,也可以适当通过抓取频率、缓存和页面优化来降低压力。
2. 限制高频异常IP
对于短时间请求量非常高,并且访问路径明显异常的IP,可以做限制。
如果使用 Nginx,可以针对请求频率设置限制。
limit_req_zone $binary_remote_addr zone=spider_limit:10m rate=3r/s;
然后在对应站点配置里启用:
limit_req zone=spider_limit burst=10 nodelay;
这类限流建议先针对异常路径或接口,不建议一开始就全站套太严格。
3. 拦截明显恶意路径
对于一些明显无效路径,比如:
phpmyadmin
.env
wp-login.php
不存在的后台路径
可以单独拦截。
location ~* (\.env|phpmyadmin|wp-login\.php) {
return 403;
}
这样可以减少无效扫描请求。
4. 优化robots.txt规则
robots.txt 不能防住恶意爬虫,但可以引导正常搜索引擎蜘蛛。
我对不需要收录的路径进行了限制,比如:
后台路径。
搜索结果页。
无意义参数页。
临时目录。
示例:
User-agent: *
Disallow: /admin/
Disallow: /login/
Disallow: /search
Disallow: /*?*
Sitemap: https://www.yeziidc.com/sitemap.xml
这里要注意,robots.txt 主要是给正规爬虫看的,不是安全防护工具。
真正恶意的爬虫不一定遵守 robots。
十一、处理后的效果
处理完成后,我继续观察访问日志。
高频异常请求明显减少。
404扫描请求下降。
服务器连接数回落。
带宽曲线恢复稳定。
正常页面访问没有受到影响。
搜索引擎蜘蛛访问也没有被误伤。
这说明分层处理比一刀切封禁更稳。
十二、这次排查的经验总结
网站被大量爬虫访问时,不能简单判断为好事,也不能直接当成攻击。
正确做法是先区分:
哪些是真实用户。
哪些是正常搜索引擎蜘蛛。
哪些是采集器。
哪些是扫描器。
如果正常蜘蛛抓取多,说明网站内容可能开始被关注。
如果异常爬虫太多,就要限制频率。
如果扫描器请求敏感路径,就要直接拦截。
爬虫问题最怕一刀切。
一刀切可能误伤收录,不处理又会浪费服务器资源。
十三、后续优化措施
为了避免后续大量爬虫再次影响网站,我做了几个长期优化。
第一,定期查看访问日志。
第二,统计高频IP和高频URL。
第三,关注404请求来源。
第四,robots.txt 保持清晰。
第五,后台路径不要暴露太明显。
第六,异常接口设置限流。
第七,静态资源尽量走CDN缓存。
第八,不轻易屏蔽正常搜索引擎蜘蛛。
做网站不是只看访问量,访问质量也很重要。
如果大量访问没有转化、没有收录价值,还消耗服务器资源,就需要及时处理。
写在最后
这次网站被大量爬虫访问,最终不是单纯的流量增长,也不是服务器故障,而是正常蜘蛛、采集爬虫和扫描请求混在一起导致访问压力上升。
站长遇到这种情况,不要急着封IP,也不要完全不管。
先看日志,再看IP频率,再看User-Agent,再看访问路径,最后再决定是放行、限流还是拦截。
网站长期运营,爬虫访问一定会越来越多。
关键不是完全禁止爬虫,而是让有价值的爬虫进来,把无效和异常请求挡在外面。