很多人把 robots.txt 当成一個“禁止抓取”的總開關,但蜘蛛真正讀它的时候,做的是一次規則匹配:把目前 URL 拿去和文件里的每一條 Allow / Disallow 比對,看哪條更具体。理解這個匹配過程,比背几條语法更有用。
規則是按分组和顺序生效的
robots.txt 由若干分组构成,每個分组以 User-agent 開头,後面跟若干 Allow / Disallow。蜘蛛只會挑和自己匹配的那個分组来讀,不會把不同分组的規則混在一起。
- User-agent: * 是所有爬虫的兜底分组;寫了具体爬虫名的分组會整体覆盖 * 分组的規則,而不是在其基础上叠加。
- 同一個分组里,匹配長度更長的那條規則優先。比如 Disallow: / 與 Allow: /public/ 同时存在时,/public/a.html 會走 Allow。
- 路径是前缀匹配:Disallow: /tmp 既挡住 /tmp 和 /tmp/1.html,也會挡住 /tmpabc。如果只想挡目錄,寫成 /tmp/ 更准确。
不同爬虫對通配符和最長匹配的遵循程度並不完全一致。規則寫得越简單直白,跨爬虫的偏差越小。
通配符不是正則
robots.txt 只認两個特殊符号:* 表示任意字符序列,$ 表示 URL 结尾。它不支持字符组、量词和分组捕获。
- Disallow: /*.pdf$ 只會挡住以 .pdf 结尾的地址。
- Disallow: /*?sort= 會挡掉任何带 sort 參數的路径,正文頁很容易被顺手誤伤,寫之前先看日誌確認參數分布。
- 路径大小寫敏感:/Images/ 和 /images/ 是两條不同路径,寫規則前先確認服務器是否区分大小寫。
几類最容易出事的寫法
- 整站誤封:Disallow: / 寫在了不该寫的分组或行里,结果全站不可抓。上线前一定要拿几個真實 URL 跑一遍驗證。
- 把 robots.txt 当收錄開關:想控制收錄要用 meta robots 的 noindex,而不是 Disallow。被 Disallow 的頁面蜘蛛讀不到内容,自然也讀不到 noindex,URL 仍可能以缺少描述的形式出現在结果里。
- 測試站沿用线上文件:预發布域名带着 Disallow: /,切流量上线後蜘蛛被挡在门外,日誌里還看不出明顯異常。
- 規則與 Sitemap 自相矛盾:robots.txt 里声明了 sitemap 地址,却把 sitemap 所在目錄 Disallow 掉。
改完怎么確認
不要只看文件内容,要看實际效果:用搜尋平台提供的 robots.txt 測試工具,輸入几個典型 URL 检查判定结果;再對照服務器日誌,看這些 URL 的請求量是否真的减少或增加。改動後的一到两周内,重点观察日誌中抓取频次與狀態碼變化,確認没有誤伤正常頁面。
另外,Crawl-delay 這類指令並非所有蜘蛛都支持,別把它当成限流的主要手段。服務器压力問题,優先從缓存、响應時間和並發连接數上解决,robots.txt 只负责表達抓取许可,不负责調节性能。