
你的监控显示流量突然暴涨,从平时的5000涨到5万。你以为是业务爆发了。但用户没有变多,订单没有增加。你意识到——这些不是真人。
爬虫在帮你“引流”的时候,未必是在帮你。找到异常流量来源,区分搜索引擎爬虫和恶意爬虫。
第一步:确认异常——是真流量还是假流量
先确定涨的是有效流量还是无效流量。
用GoAccess或AWStats分析Nginx日志,找出:
- 哪些URL被访问得最多(如果集中在几个URL,很可能是爬虫)
- 请求频率最高的IP是哪些
- 这些请求的User-Agent是什么
bash
tail -10000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
如果排第一的IP请求量是第二名的几十倍,大概率是爬虫。
第二步:区分搜索引擎爬虫和恶意爬虫
搜索引擎爬虫是“好人”:Googlebot、Baiduspider、Bingbot、Yandex。它们抓取网页用于索引,不会刷爆你的服务器。你可以通过User-Agent识别,也可以做反向DNS验证。
验证Googlebot:
bash
host 66.249.66.1 # 解析为 crawl-66-249-66-1.googlebot.com nslookup 66.249.66.1 # 确认IP属于googlebot.com
恶意爬虫没有规律:请求频率极高(每秒几十到几百次)、不遵守robots.txt、User-Agent伪造、来源IP分散。
| 特征 | 搜索引擎爬虫 | 恶意爬虫 |
|---|---|---|
| 请求频率 | 可控 | 极高,无节制 |
| User-Agent | 真实可验证 | 伪造、空值、明显虚假 |
| robots.txt | 遵守 | 忽略 |
| 访问URL | 有限 | 无差别扫描 |
| IP归属 | 固定范围 | 随机/代理池 |
第三步:应对方法
针对恶意爬虫:
Nginx限流:限制单个IP单位时间内的请求次数,超过阈值直接返回429。
nginx
limit_req_zone $binary_remote_addr zone=爬虫限制:10m rate=10r/s;
location / {
limit_req zone=爬虫限制 burst=20 nodelay;
}
User-Agent屏蔽:如果爬虫使用固定的虚假User-Agent,直接在Nginx屏蔽。
nginx
if ($http_user_agent ~* (bot|crawler|spider|scrape)) {
return 403;
}
IP黑名单:如果爬虫IP固定,封掉。也可以通过云厂商安全组或防火墙动态封禁。
bash
iptables -A INPUT -s 123.45.67.89 -j DROP
Nginx返回503:让爬虫以为服务器暂时不可用,从而放弃抓取。
针对搜索引擎爬虫:
配置适当的抓取延迟,防止搜索引擎爬虫在高峰时段占用过多资源。通过robots.txt指定抓取频率和可抓取的范围。
真实案例
一个电商网站的流量突然从每天5000涨到8万,服务器CPU持续100%。分析Nginx日志发现某个IP每秒请求200次以上,而且只访问同一个商品页面。
确认是恶意爬虫在抓价格数据。在Nginx添加限流规则,限制该IP每秒最多5次请求,CPU瞬间恢复正常。
最后一句
流量暴涨不一定是好事。先确认涨的是真流量还是假流量。看IP分布、URL集中度、User-Agent。Nginx限流是抵御恶意爬虫最直接的手段。如果限流后仍有异常,检查访问日志,针对性屏蔽User-Agent或IP段。恶意爬虫不会遵守robots.txt,但会遵守你的防火墙规则。




