很多站长以为写好 robots.txt 就能挡住爬虫,实际上它只是一份”君子协定”。本文用问答形式讲清 robots.txt 的真实作用、恶意爬虫是否遵守、它还有没有配置价值、Nginx 层面拦截恶意爬虫的实战配置,以及网站被抓崩后的处理思路。
Q:robots.txt是什么,起什么作用?
robots.txt 是放在网站根目录的文本文件,通过 User-agent 和 Disallow 指令告诉爬虫”哪些目录可以抓、哪些不能抓”。关键在于:它是一个建议,不是强制手段,协议本身没有任何技术约束力。正规搜索引擎(百度、Google)的爬虫会自觉遵守:
User-agent: Baiduspider
Disallow: /admin/
Disallow: /member/
User-agent: *
Disallow: /private/
Sitemap: https://example.com/sitemap.xml
Q:恶意爬虫会遵守robots.txt吗?
不会。恶意爬虫的目标就是抓你要保护的内容,对协议要么完全无视,要么反过来利用——你 Disallow 了 /admin/,它反而知道那里有高价值目录。指望 robots.txt 防恶意爬虫,等于把家门钥匙放在门口的垫子下面。
Q:那robots.txt还有必要配置吗?
有必要,但作用不在防攻击,而在 SEO 管理:引导正规蜘蛛抓取该抓的页面、节省抓取配额、避免后台路径和重复页面被收录。防恶意爬虫这件事,要交给下一层技术手段。
Q:恶意爬虫有哪些识别特征?
- 频率特征:单 IP 请求速率远超人类,7×24 小时不间断;
- UA 特征:空 UA、python-requests、Go-http-client、Scrapy 等客户端 UA,或拼错/过期版本的浏览器 UA;
- 行为特征:只抓 HTML 不加载 JS/CSS/图片,访问路径呈规律性目录遍历;
- TLS 指纹:JA3 指纹与真实浏览器不符,UA 伪装得再像也藏不住握手特征。
Q:Nginx怎么拦截恶意爬虫?
第一步,UA 黑名单拦截明显恶意客户端:
map $http_user_agent $bad_bot {
default 0;
~*python-requests 1;
~*Go-http-client 1;
~*scrapy 1;
~*curl 1;
~*wget 1;
"" 1;
}
server {
if ($bad_bot) { return 403; }
}
第二步,对漏网的高频抓取叠加限流:
limit_req_zone $binary_remote_addr zone=antispider:10m rate=10r/s;
location / {
limit_req zone=antispider burst=20 nodelay;
}
rate 参数要按业务实际调整,建议先宽后严,避免误伤真实用户和正规蜘蛛。
Q:空UA和脚本UA一律封会不会误伤?
大多数业务场景可以封,但要留意两类例外:监控拨测服务和合规 API 客户端。稳妥做法是先”记录不拦截”——把 return 403 换成记日志观察一周,确认没有正常来源后再启用封禁。
Q:爬虫把网站抓崩了怎么办?
- 分析访问日志定位抓取来源与路径,判断是单 IP 还是分布式抓取;
- 单 IP 高频直接封 IP 或 IP 段;分布式低频则上验证码或 JS 挑战;
- Nginx 限流兜底,优先保住数据库和上游应用;
- 长期方案是接入 WAF 或 CDN,把爬虫识别放到边缘节点处理,别让流量打到源站。
Q:还有什么补充建议?
robots.txt、UA 黑名单、限流、WAF 是层层递进的关系:robots.txt 管 SEO 分工,Nginx 管明显恶意流量,WAF 管高级伪装爬虫,别把宝押在任何单层上。另外,定期核对日志里自称”百度蜘蛛/Googlebot”的流量是否真实(反查 IP 归属即可验证),不少恶意爬虫就靠冒充搜索引擎白嫖你的页面,这类假蜘蛛在日志里占比往往超乎想象。