robots.txt 是最早被爬虫讀取的文件之一,但它经常被当成萬能開關:想屏蔽就寫一條 Disallow,想放行就删掉一行。實际上它只负责一件事——告诉爬虫哪些路径可以抓。抓不到並不等于不會出現在搜尋结果里,這一点理解错,後面很多判断都會跟着错。
它管的是抓取,不是索引
robots.txt 属于抓取层协议。被 Disallow 的 URL,爬虫通常不會去取内容,但只要別處有指向它的連結,搜尋引擎仍可能把它当作一條没有摘要的结果保留下来。要阻止索引,稳妥的组合是:允许抓取,並让頁面返回 noindex(meta robots 或 X-Robots-Tag)。如果頁面本身被 robots.txt 挡住,爬虫看不到 noindex,這個标簽也就失效了。
文件位置與生效范围
- 只對目前协议、主机和端口生效。https://www.example.com/robots.txt 管不到子域名,也管不到其它端口。
- 路径必须是根目錄下的 /robots.txt,放在子目錄里不生效。
- 返回 200 才按規則执行;返回 404 通常被视為没有限制;返回 5xx 时不同爬虫的處理方式不一样,與其依赖兜底,不如让服務端保持稳定。
- 内容用 UTF-8,一行一條指令,注释以 # 開头。
規則的基本结构
最外层是 User-agent 加若干條 Disallow 或 Allow,每條規則作用于它上方最近的那個 User-agent 组。
- User-agent: * 表示所有爬虫;也可以寫具体名稱,但名稱拼错的那一组不會生效。
- Disallow: 後面留空,表示不限制任何路径。
- Disallow: / 表示屏蔽整站,這是上线測試时最常用、也最容易被遗忘的一條。
匹配顺序:更具体的優先
当 Allow 和 Disallow 同时命中一個 URL 时,主流爬虫按匹配到的字符串更長者優先来判断,長度相同时 Allow 通常優先。所以想放開某個目錄下的個別文件,可以补一條更長的 Allow:
- Disallow: /admin/
- Allow: /admin/public/
這里的比較對象是匹配長度,不是书寫先後,調換两行的顺序不會改變结果。
通配符與结尾符
* 匹配任意字符,$ 表示 URL 结尾,两者组合可以精确控制带參數的地址:
- Disallow: /*? 會挡住所有带查询參數的 URL,正常的内容頁參數也會被一起挡掉。
- Disallow: /*?sessionid= 范围更窄,更接近真實意图。
- Disallow: /*.pdf$ 只挡 PDF,不會连带挡住 /a.pdf.html 這類地址。
几個常见誤伤
- 把目錄名当成前缀。Disallow: /search 會同时挡住 /search、/search-help、/search-result,寫成 Disallow: /search/ 才是通常想要的邊界。
- 複製模板时留下 Disallow: /,整站在抓取层被拒之门外,站内連結也無法被跟進。
- 用 robots.txt 屏蔽分頁頁、篩選頁,结果连带挡住了這些頁面上的詳情連結,新 URL 的發現路径被一起切断。
- 把 robots.txt 当成临时下线開關,改完忘了删回。
和 Sitemap、频率控制的關系
robots.txt 里可以寫一行 Sitemap:,给出 sitemap 或 sitemap 索引的完整地址,方便爬虫直接找到名單文件。要注意,即使某個目錄被 Disallow,寫在 Sitemap 里的 URL 也不會因此被放行——爬虫讀到名單後仍受抓取規則约束。
Crawl-delay 是部分爬虫才支持的指令,主流搜尋爬虫大多不依赖它来調节频率,服務端压力更應该通過缓存、限流和响應時間来管理。想给爬虫留余量,比較稳妥的做法是保證重要頁面响應稳定,而不是赌一條延迟指令。
判断标准可以简化成一句:這條規則是让爬虫看不到某個地址,還是让搜尋引擎不收這個地址。前者用 robots.txt,後者用 noindex,两者混用往往两邊都做不成。
上线前的检查清單
- 直接訪問 /robots.txt,確認返回 200 且内容是目前版本。
- 逐條核對 Disallow 的路径前缀,確認没有意外覆盖正常目錄。
- 確認没有残留 Disallow: /。
- 检查 Sitemap 指令是否指向可訪問的名單文件。
- 上线後看抓取日誌:原本正常的目錄如果抓取量突然归零,先怀疑 robots.txt。
robots.txt 的規則並不多,寫错一次影响面却不小。把它当成一份需要版本管理的配置文件,每次改動都留记錄、都驗證,比事後從抓取日誌里反查原因要省力得多。