robots.txt 是站長手里最直接的一個開關,改起来只需要一個文本文件。但很多人改完之後會困惑:明明已经 Disallow 了,日誌里那條路径還在被抓;或者反過来,原本抓得好好的目錄,忽然安静了。這中間隔着的,是蜘蛛讀取規則的节奏和它對你這份文件的解讀方式。
蜘蛛不是每次抓取前都重新下载 robots.txt
绝大多數爬虫在抓取前會先取一次 robots.txt,但為了省流量,它們會把這份文件缓存一段時間。缓存没過期,蜘蛛就繼續按舊規則走。所以你改完文件後的几小时内,日誌里仍出現舊行為,属于正常現象,不代表改動失敗。
比較實际的做法是:改完之後记住時間点,然後回到服務器日誌中,专门看 /robots.txt 這個請求的時間戳。当日誌里出現了改動之後的又一次請求,通常意味着新版本已经進入它的缓存。
不同蜘蛛的节奏並不一致
- 大型搜尋引擎的爬虫缓存時間相對長一些,規則切換偏慢但稳定。
- 部分二线爬虫、聚合類爬虫可能每次都重新讀取,改動几乎是即时的。
- 還有一些小爬虫基本不看 robots.txt,規則改不改對它没有影响。
因此,用一次观测去推断所有蜘蛛的行為,容易得出错誤结论。分爬虫、分時間段看日誌,才看得出差异。
先確認 robots.txt 本身能被正常取到
規則能不能生效,前提是文件能被取到並且被正确解讀。几個基础检查点:
- 路径必须是根目錄下的 /robots.txt,子目錄里的同名文件不起作用。
- 返回值應為 200,内容為纯文本,不要返回 HTML 頁面。
- 用 301 或 302 跳到別的域名或路径时,各家爬虫處理方式不同,有的會跟随,有的直接当作異常,稳定性差,建议直接返回 200。
- 返回 4xx(除 429 這類限流碼)时,多數爬虫會视為「没有限制」,也就是放行全部抓取。
- 返回 5xx 时,Googlebot 的處理偏保守,會暫停抓取该站,而不是当成允许。
改動前後都在日誌里留下 robots.txt 的請求记錄,比凭感觉猜测可靠得多。
几個容易寫错、寫错又不易察觉的地方
- Disallow 只负责阻止抓取,不等于让已收錄的頁面消失。想让頁面登出索引,需要頁面本身返回 noindex,或走相應的移除流程。
- 路径区分大小寫,/News 和 /news 是两個不同的位置,寫漏一個等于没挡。
- 通配符 * 與结尾符 $ 的支持程度各家不同,用来做精细控制的規則,最好用測試工具逐個驗證。
- Sitemap 是獨立指令,不要塞進某個 User-agent 组里去理解,它的位置和分组無關。
- 規則是從上往下匹配的,但同一组内多條 Allow 與 Disallow 的優先級,不同爬虫的實現會有细微差別,規則越简單越不容易出問题。
让改動被更快感知的几個做法
- 改動前,把想挡和想放的 URL 各挑几個,用測試工具確認匹配结果符合预期。
- 一次只改一處,改完留出观察窗口,日誌里的變化才容易归因。
- 保留舊版本文件,發現誤伤时能立刻回滚。
- 改完關注 robots.txt 的請求時間戳,確認新版本已经被讀取,再判断效果。
- 如果目的只是控制抓取频率,優先考虑抓取频次設定或服務器端限流,而不是整條路径封掉。
把它当成门槛,而不是實时開關
robots.txt 更像一道门槛:它决定了蜘蛛能走到哪里,但從你修改它,到蜘蛛按新規則走路,中間有一段缓冲。给這段時間留出余量,用日誌確認規則已被讀取,比反复修改文件更有效。真正需要即时控制的场景,比如临时流量压力,還是交给服務器侧的手段更稳妥。