robots.txt 是站点给爬虫的第一份說明文件。它不决定收錄,却决定蜘蛛能不能走到某個 URL。很多被归到“蜘蛛不来抓”的問题,最後追到根上,只是這個文件里有一條規則寫歪了。
蜘蛛讀 robots.txt 的顺序
爬虫在請求一個 URL 之前,會先取一次 robots.txt,然後拿路径去匹配規則。匹配不是從上往下“命中即停”,而是比較規則的具体程度。
- 路径越長、越具体的規則優先。Disallow: / 和 Allow: /news/ 同时存在时,/news/a.html 會走 Allow 那條。
- 長度相同时,Google 等爬虫按 Allow 優先處理,但不同爬虫的實現並不一致。關键路径的放行不要建立在“長度相等靠 Allow”這種假设上。
- User-agent 分组匹配的是最贴近的那一段。寫了多個分组时,蜘蛛只讀與自己最匹配的那组,其余组會被直接忽略。
- * 代表任意字符序列,$ 代表结尾。/private* 會拦住 /private/ 和 /privateabc;/file$ 只拦住恰好以 file 结尾的路径。
几種把蜘蛛挡在门外的寫法
- Disallow 後面寫完整 URL,而不是以斜杠開头的路径。規則不會按预期生效,也可能誤伤別的路径。
- 測試环境屏蔽了整站,上线後忘了删掉 Disallow: /。
- 把 /css/、/js/ 一起屏蔽。渲染抓取拿不到样式和脚本,蜘蛛看到的是一個半成品頁面,内容判断容易失真。
- 用一個通配符把带參數的路径全拦掉,结果分頁、篩選和列表翻頁一起被挡在门外。
- 忽略大小寫差异。/News/ 與 /news/ 在規則里是两條不同路径。
- 對同一批頁面同时用 noindex 和 Disallow。被屏蔽的頁面蜘蛛讀不到 noindex,反而可能因為外鏈被索引成一個没有描述的结果。
- crawl-delay 设得過大,等于主動给抓取降速。除非服務器确實扛不住,否則不建议依赖這個字段。
被拦住的頁面,在資料里長什么样
robots 拦截不會产生 404。訪問日誌里通常能看到 robots.txt 本身的請求,但目标 URL 根本不出現;在抓取統計里會顯示為“被 robots.txt 屏蔽”。如果用的是 403 加 noindex 的组合,蜘蛛拿到的是禁止訪問,它對頁面的判断就只剩外鏈和锚文本了。
判断标准很简單:希望被收錄的頁面,就必须先能被抓取。noindex 只有在蜘蛛讀得到頁面时才起作用。
核對與维護的顺序
- 用官方的 robots.txt 測試工具或站内模拟,逐條驗證關键路径是放行還是拦截。
- 把屏蔽規則和 Sitemap 里的 URL 做一次交叉比對,看有没有重要頁面被挡住。
- 看服務器日誌里 robots.txt 的請求频率與狀態碼。稳定返回 200,說明蜘蛛在讀;長期 5xx 會被按失敗處理,規則更新也跟着延迟。
- 改版、換目錄、上线語言站之後,重新跑一遍上面的流程。目錄變了,規則里的路径也要同步改。
和 Sitemap、内鏈的分工
Sitemap 负责告诉蜘蛛有哪些 URL,内鏈负责给蜘蛛一條走得通的路,robots.txt 负责說明哪些別走。三者冲突时,蜘蛛的反應往往很直接:Sitemap 里提交但被規則拦住的 URL,會被当成無效提交;内鏈指向被拦路径,等于白送一次連結传递。規則、Sitemap、内鏈指向同一批 URL,抓取才會顺。
最後一句提醒:robots.txt 是一份蜘蛛随时可讀的公開文件,改動後不需要提交,但生效有延迟。删規則比加規則更值得谨慎,先把要放行的路径测通,再考虑收紧。