站点抓取出問题时,很多人的第一反應是查 Sitemap、查内鏈,却忽略了蜘蛛進站前讀到的第一份文件:robots.txt。它不负责让頁面被收錄,只负责告诉蜘蛛哪些路径可以来、哪些不要来。這份文件寫错,往往不只是少抓几頁,而是整站的抓取入口被直接收窄。
蜘蛛是怎么讀到 robots.txt 的
标准位置是域名根目錄下的 robots.txt,蜘蛛在抓取某個 URL 之前,會先按协议去取這份文件。它本身也是一次 HTTP 請求,所以服務器狀態會直接影响结果:
- 返回 200 且内容正常:按文件里的規則执行。
- 返回 404 或 410:视為没有限制,站内 URL 基本都可以抓。
- 返回 5xx 或连接超时:不同引擎的處理不完全一致,但普遍會變得保守,可能减少甚至暫停抓取。
所以把 robots.txt 挂在會频繁报错的動態逻辑上是很危險的做法,它更适合作為一個几乎不變的静態文件存在。
Disallow 與 Allow 的基本寫法
規則按 User-agent 分组,路径按前缀匹配。最容易出問题的地方是结尾的斜杠:寫目錄时带上斜杠,匹配范围才准确。
- 寫成 /search/ 表示屏蔽搜尋结果目錄;寫成 /search 則可能连带屏蔽 /search-help 這類路径。
- Allow 用来在整体屏蔽的目錄里開口子,規則顺序上更具体的路径通常優先。
- 通配符和结尾符号可以覆盖一批相似 URL,但用得越多,越容易誤伤正常頁面。
寫完最好用抓取工具或日誌驗證一遍,光靠肉眼看規則很容易漏。
最容易踩的坑:Disallow 之後 noindex 也失效了
頁面被 Disallow 之後,蜘蛛不會去抓它,也就讀不到頁面里的 noindex。如果你真正想要的只是不收錄,而不是不抓取,那應该用 noindex。
這是两個常被混用的東西,作用完全不同:robots.txt 管的是抓取,noindex 管的是索引。希望頁面保留抓取能力但不出現在结果里,就让它可抓,再在 HTML 中加上 noindex。反過来,如果某類頁面确實没有抓取價值,比如带多個參數的站内篩選结果、後台路径,用 robots.txt 拦掉,反而能把抓取机會留给更重要的 URL。
通常不建议拦掉的東西
有些人為了节省抓取预算,把 CSS、JS、图片一起拦了。结果蜘蛛拿到的頁面结构不完整,渲染出来和用戶看到的有差距,判断頁面内容时容易失真。以下几類建议保持可抓:
- 頁面渲染依赖的 CSS 與 JS 文件。
- 正文图片以及懒加载所用到的资源。
- 列表頁與分頁連結,除非确實不打算被收錄。
- 移動端對應的頁面地址。
Crawl-delay 與抓取节奏
部分爬虫會參考 Crawl-delay,也有不少並不使用它。真正影响抓取节奏的,更多還是服務器的响應速度和稳定性:响應快、持續可用,蜘蛛自然愿意多来;时不时 500 或超时,它就會主動降频。與其指望用 Crawl-delay 精确控速,不如先把服務端稳定下来。
站点改版时的過渡處理
改版後舊目錄不再存在,常见的错誤是直接在 robots.txt 里把舊目錄 Disallow 掉。這样蜘蛛既進不去舊頁面,也就看不到頁面上的 301,URL 的迁移信号传不過去。
更稳妥的顺序是:先让舊 URL 保持可抓,並在服務端配置好 301 指向新地址;等跳轉被识別、流量迁移基本完成之後,再考虑用 robots.txt 收掉确實無需再抓的路径。
上线前的检查清單
- 確認域名根目錄下的 robots.txt 能正常返回 200,且内容是目前版本。
- 检查是否誤屏蔽了整站,例如把整個根目錄都 Disallow 掉。
- 確認測試环境的 robots.txt 没有被带到线上。
- 確認需要抓取的目錄没有被通配符意外匹配。
- 把 robots.txt 從動態逻辑中剥离,避免它跟着後端一起报错。
robots.txt 不需要寫得很复杂,它更像一道门槛,而不是策略中心。该放行的放行,确實没有價值的路径拦掉,剩下的交给内鏈、Sitemap 和稳定的服務器去完成就好。