蜘蛛在抓取站内任何一個具体 URL 之前,通常會先請求一次 robots.txt。很多人只把它当成一張禁止進入的告示,寫两條 Disallow 就收工。實际上它同时扮演几個角色:声明 Sitemap 位置、划定可以抓取的范围、在某些搜尋引擎上提示抓取节奏。規則寫得准,能省下不少抓取资源;寫得偏,可能让整站内容從蜘蛛视野里消失。
位置固定,讀取顺序靠前
robots.txt 只能放在域名根目錄,路径固定為 https://example.com/robots.txt。放在子目錄里没有意义,蜘蛛不會去那里找。
不同返回狀態對應不同處理:返回 404,通常按“允许抓取全部”處理;返回 5xx,說明服務器端有問题,蜘蛛可能暂时降低抓取频率;返回 200 但内容為空,等同于不做任何限制。所以這個文件本身也是一個需要保持可訪問的地址。
用 Sitemap 声明把 URL 清單递過去
除了 Disallow,robots.txt 里最實用的一行是 Sitemap 声明。蜘蛛讀到這里,就多了一條發現 URL 的路径,不必全靠内鏈一层层爬。
User-agent: *
Disallow: /search
Allow: /search/about
Sitemap: https://example.com/sitemap.xml
- 每行一個完整地址,必须带协议和域名,相對路径無效
- 有多個 Sitemap 就寫多行,也可以声明 Sitemap 索引文件
- 声明只是一條线索,不代表會被抓取,更不代表會被收錄
Allow 與 Disallow 的匹配细节
路径按前缀匹配,/news 會同时命中 /news、/news/2024、/newsletter。想精确一些,可以用通配符 * 和结尾符 $。当 Allow 和 Disallow 同时命中一條路径时,通常長度更長、更具体的那條生效。
另外:路径区分大小寫;只寫路径不寫域名;多個 User-agent 段落要分開,別把規則寫成一大段無主语句。
Crawl-delay 的作用比想象中有限
Crawl-delay 以秒為單位,看起来很适合用来保護服務器,但主流搜尋引擎對它的支持並不一致,Google 明确不遵循這個字段。真正控制抓取压力的手段,是服務器侧的限速、缓存策略、CDN 回源控制,以及在日誌里观察抓取峰值。
把 Crawl-delay 寫成一個大數字,往往只是让愿意配合的蜘蛛放慢脚步,新内容被發現的時間跟着變長,而真正造成压力的請求未必减少。
几個容易踩的坑
- 以為 Disallow 等于“不被收錄”。如果外部有連結指向该地址,它仍可能出現在结果里。想去掉索引要用 noindex,但 noindex 需要蜘蛛能抓到頁面,两者會冲突,需要按路径分開處理。
- 顺手屏蔽 JS、CSS、图片目錄。蜘蛛渲染頁面时拿不到样式和脚本,可能誤判頁面质量,也可能看不到脚本生成的連結。
- 規則里带問号、通配符、大小寫不统一,實际屏蔽范围超出预期,把正文目錄一起挡在门外。
- 長期不维護,Sitemap 里堆着一批已经失效的地址。
改動前後可以對照的清單
- 根目錄文件可訪問,返回 200,不是 301 到別處
- 不屏蔽 JS、CSS、图片、字体等渲染依赖
- Sitemap 使用绝對地址,内容定期同步
- 上級目錄被屏蔽时,重要子目錄用 Allow 顯式放行
- 改完之後對比服務器日誌,看蜘蛛的訪問路径和频次有没有變化
robots.txt 是一份長期生效的约定文件,改動的影响會持續一段時間。動手之前先备份一份,改完隔几天再看日誌,比凭感觉調規則稳妥得多。