如何通过日志判断蜘蛛是否遵守网站的 robots.txt 规则?
判断蜘蛛是否遵守 robots.txt 不能只看其是否请求过该文件,还需核查日志中被 Disallow 的路径是否被抓,并通过反向 DNS 验证 User-Agent 真实性,排除伪造和工具抓取后才能认定违规。
判断蜘蛛是否遵守 robots.txt,核心看三件事:日志里有没有它对 /robots.txt 的请求记录、被 Disallow 的路径有没有被它抓过、以及抓取行为与你写的规则是否矛盾——三条都查完,才能下结论。
为什么不能只看“它请求过 robots.txt”?
结论:请求过 robots.txt 不等于遵守 robots.txt,那只是“读了规则”,关键看它读完之后有没有绕开被禁路径。
标准爬虫的流程是:抓取页面前先 GET 一次 /robots.txt,拿到规则后决定哪些 URL 不抓。所以日志里出现这两条记录是正常信号:
grep "/robots.txt" access.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn
# 看某个蜘蛛拿到的状态码($9 是状态码)
grep -i "Googlebot" access.log | grep "/robots.txt" | awk '{print $9}' | sort | uniq -c
状态码含义要分清:200 表示规则文件正常返回;404 表示“没有 robots.txt”,按 RFC 9309 的规定等同于“全部允许”,爬虫继续抓页面不算违规;5xx 则相反,Googlebot 在遇到 robots.txt 返回 5xx 时会暂停抓取,48 小时后重试。
被 Disallow 的目录出现在日志里,就一定是违规吗?
结论:不一定,日志里出现被禁 URL 有三种可能,其中只有“真实蜘蛛用真实 UA 抓取”才算违规。
第一种是 UA 伪造——别人拿 Googlebot 这个字符串去扫你的站,日志里看起来一模一样。第二种是你自己人干的:Google Search Console 的网址检查、robots.txt 测试工具都会真实发起抓取,请求也会落进日志。第三种才是真违规,通常出现在一些自称是搜索引擎、但反查域名对不上的小爬虫身上。
排查时先列出 robots.txt 里所有 Disallow 路径,再去日志里反查:
grep -E "GET /(admin|tmp|api/internal)/" access.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn
如果命中的 UA 集中在几个陌生名字上,基本可以判定是这些爬虫不守规矩;如果命中 Googlebot,先去做 IP 反查再下结论。
User-Agent 写着 Googlebot,就是 Google 吗?
结论:不是。UA 是客户端自己填的字符串,必须用反向 DNS 验证,这是唯一可靠的区分手段。
Googlebot 的正规验证方式是双向解析:先反查 IP 得到主机名,再正向解析该主机名确认能回到同一 IP。
dig +short -x 66.249.66.1
# 应返回 crawl-66-249-66-1.googlebot.com.
dig +short crawl-66-249-66-1.googlebot.com
# 应返回 66.249.66.1
主机名后缀必须是 googlebot.com 或 google.com;Bingbot 对应 search.msn.com;Baiduspider 对应 baidu.com。批量验证可以写个循环:
grep "Googlebot" access.log | awk '{print $1}' | sort -u | while read ip; do \
echo -n "$ip -> "; dig +short -x $ip; done
Google 还公开了完整的 Googlebot IP 段 JSON(developers.google.com/static/search/apis/ipranges/googlebot.json),可以直接对比。
哪些“违规”其实是误判?
结论:Crawl-delay 不被遵守、以及 robots.txt 缓存导致的延迟生效,都不算违规。
Crawl-delay 不是 RFC 9309 的正式指令,Googlebot 完全不支持这条,只在 Search Console 的抓取速率设置里调频率;Bingbot 和 Yandex 支持。所以你在 robots.txt 里写 Crawl-delay: 10,看到 Googlebot 请求间隔只有 1 秒,不能算它违规。
另外按 RFC 9309 的要求,爬虫缓存 robots.txt 的时间不应超过 24 小时。也就是说你今天新加的 Disallow,最迟 24 小时内生效,这段时间内旧路径仍被抓取属于正常现象——判断时把日志时间点和 robots.txt 的修改时间对齐再看。
一条命令快速筛查不守规矩的爬虫
结论:把“请求过 robots.txt 的 UA”和“抓过被禁路径的 UA”两个列表做差集,剩下的就是可疑对象。
grep "/robots.txt" access.log | awk -F'"' '{print $6}' | sort -u > read.txt
grep -E "GET /(admin|tmp)/" access.log | awk -F'"' '{print $6}' | sort -u > hit.txt
comm -13 read.txt hit.txt # 抓了禁抓路径、却从没读过 robots.txt
comm -13 输出的那些 UA,就是既没读规则又抓了敏感路径的爬虫,再逐个做 IP 反查确认身份,最后在 Nginx 层用 if ($http_user_agent ~* "xxx") { return 403; } 或 WAF 规则封掉。
总结:判断顺序是“先看有没有请求 robots.txt → 再看被禁路径有没有被抓 → 最后用反向 DNS 确认对方身份”。只凭 UA 字符串或单条日志下结论,最容易把伪造者和自己人误判成违规蜘蛛。
转载请注明出处,版权归原作者所有。