robots.txt 是站点给爬虫的第一份說明,也是最少被翻看的文件之一。很多站点從上线那天起就没再動過它,直到某天發現栏目頁一直不被抓取,或者後台目錄反复出現在日誌里。它的改動成本极低,一行字符就能改變整站的抓取范围,所以值得定期拿出来對一遍。
先確認它真的能被讀到
規則寫得再對,讀不到也没用。检查這几項:
- 位置在域名根目錄,路径是 /robots.txt,不能放在子目錄里代替。
- 直接訪問返回 200。如果被 301 或 302 跳到別處,部分爬虫不會繼續跟随,等于没有這份文件。
- 返回内容必须是纯文本。配置失誤时常见的情况是返回了一整頁 HTML 报错頁,爬虫讀到的是标簽而不是規則。
- 没有被 CDN 或反向代理長期缓存。改完規則後如果缓存没刷新,蜘蛛拿到的還是舊版本。
- 文件開头没有多余的 BOM 字符或空行導致的解析異常。
三類最容易出事的寫法
測試站規則被带到了正式站
開發阶段為了防止測試环境被抓,通常會寫 Disallow: /。上线时忘了删掉這一行,整站就等于關上了门。這類問题往往几天甚至几周後才被察觉,因為訪客訪問一切正常,只有日誌里安静得反常。
顺手挡掉了 CSS、JS 和图片
有人為了节省抓取量,把 /css/、/js/、/images/ 一並挡掉。结果搜尋引擎無法正常渲染頁面,判断内容质量时看到的是一個没有样式的骨架;图片资源也可能因此進不了图片搜尋。除非你有明确的理由,否則這些目錄建议保持放行。
把 Disallow 当成 noindex 用
這是最常见的誤解。被 robots.txt 挡住的頁面,抓取被禁止,但它仍然可能出現在搜尋结果里——因為外部連結可以暴露這個地址,爬虫虽然不能讀内容,却知道它存在。反過来,如果你想让頁面彻底登出索引,應该使用 noindex,而 noindex 的頁面不能同时被 robots.txt 挡住,否則爬虫看不到那個标簽,指令就落空了。两者要配合,不要互相遮挡。
規則细节里的坑
- User-agent 分组要分開寫。想對多個爬虫生效,就寫多段配置,不要在一行里塞多個名稱。
- Allow 和 Disallow 冲突时按最長匹配判断。路径更具体的那條生效;長度相同时 Allow 優先。用這個特性可以做“挡整個目錄、放行其中一個子路径”的操作。
- 通配符不要滥用。* 代表任意字符,$ 表示结尾锚定。寫 /*.pdf$ 和寫 /*.pdf 的含义並不一样,前者只匹配以 .pdf 结尾的地址。
- 一行只寫一條規則。同一行里用空格隔開多條路径,通常只有第一條被识別。
- 注释用 #。用 // 開头的寫法不被支持。
- Crawl-delay 基本已经無效。主流搜尋引擎不再支持這個指令,想控制抓取节奏應改從服務器响應速度和站点结构入手。
- 路径区分大小寫。寫 /Admin/ 不一定挡得住 /admin/。
不建议寫進去的内容
robots.txt 是公開文件,任何人都能訪問。把後台入口、临时上传目錄、备份文件命名規則寫進去,相当于给掃描工具递了一份地图。
robots.txt 是“請求不要抓取”,不是訪問控制。真正需要保護的目錄,應该用登入驗證、IP 限制或者干脆不放在公網可訪問的位置。
站点地图的地址可以寫在這里,方便爬虫發現,這是它少數值得保留的附加用途。
改完之後的驗證步骤
- 用命令行或浏览器直接取回文件,確認返回内容和本地一致,狀態碼是 200。
- 抽查几條關键路径:首頁、主要栏目、一篇詳情頁、CSS 目錄、图片目錄,逐條確認放行或拦截符合预期。
- 如果站点有搜尋引擎提供的抓取測試工具,可以用它模拟一次讀取,看規則是否按设想解析。
- 改動後观察几天訪問日誌,重点看原本被挡的目錄是否重新出現抓取记錄,或者不该被抓的地址是否终于安静下来。
- 保留一份改動前的版本,並记下修改時間。規則出問题时,回滚比逐條排查快得多。
把 robots.txt 纳入到例行检查里,和站点地图、重定向、404 一起看,能省下不少事後排查的時間。它不需要经常改,但每次改動都值得多看一眼。