robots.txt 放在站点根目錄,是给爬虫看的建议书。它没有任何强制力,也谈不上訪問控制——但它常常决定入口頁在第一轮抓取里是放行還是被拦下。這份文件寫對了不會带来額外好處,寫错了却足以让前面做的工作全部浪費。
入口頁的基本姿態:放行
蜘蛛池入口頁的职责是承接抓取、把蜘蛛引向目标頁,所以預設姿態應该是放行。常见的错誤寫法是出于安全考虑直接寫一整段 Disallow: /,把整站關掉,然後又指望蜘蛛照常来抓入口頁。這两件事在逻辑上不可能同时成立。
一個可用的最小结构大致是這样:允许全站抓取,單獨屏蔽几個不该出現的目錄,再把 sitemap 地址寫進去。
- 允许抓取入口頁本身,這是最基础的
- 允许抓取入口頁引用的 CSS、JS、图片等静態资源
- 用 Sitemap 指令指向入口頁或頁面清單的地址
- 只對确實無意义的目錄做屏蔽,不要成片封杀
哪些東西值得屏蔽
屏蔽規則要克制。入口頁的目錄结构和普通站点不一样,通常没有用戶後台、购物车這類内容,所以真正需要挡住的並不多:
- 後台、管理路径和測試目錄
- 會輸出大量重复结果的站内搜尋地址
- 临时生成、随时會失效的調试頁面
- 返回 5xx 或重定向鏈過長的路径
注意這里的屏蔽是對合規爬虫生效的。對方是否遵守,不在你的控制范围内,因此不要把 robots.txt 当成防抓措施来设計。
几個最容易寫错的地方
誤伤 CSS 和 JS
很多模板會顺手把 /assets/、*.js、*.css 一起屏蔽掉。對于依赖脚本渲染的入口頁,這會让蜘蛛拿到的是一份空壳。移動優先索引下,渲染能力本来就有限,把资源挡住只會让頁面更难看懂。除非确定頁面是纯静態輸出,否則別動静態资源目錄。
屏蔽了頁面,又想让它不被索引
noindex 必须被蜘蛛讀到才生效,而被 robots.txt 屏蔽的頁面,蜘蛛压根不會去讀里面的 meta 标簽。所以“先 Disallow,再加 noindex”是典型的自相矛盾。想让頁面登出索引,就放行抓取、只加 noindex;想减少抓取压力,就用 robots.txt。两者選一個。
crawl-delay 的兼容問题
crawl-delay 並不是所有爬虫都支持。寫上去通常不會有什么坏處,但也不要指望它真的能控制訪問频率。真要控制並發,從服務器侧做限速、限连接數更靠得住。
多域名批量複製的事故
蜘蛛池往往有几十上百個域名,robots.txt 一般是统一複製過去的。一旦模板里残留了一條 Disallow: /,就會在所有域名上同时生效,而且不會报错,只能靠人工發現。建议每次批量下發後,随机抽几個域名實际訪問一遍 /robots.txt 看内容。
上线前的自查清單
- 用浏览器直接訪問几個域名下的 /robots.txt,確認返回 200 且内容完整
- 確認没有全站 Disallow,也没有誤伤静態资源目錄
- 確認 Sitemap 地址可訪問,返回的是頁面清單而不是错誤頁
- 確認屏蔽規則和 noindex 的使用没有互相冲突
- 批量更新後抽查若干域名,而不是只看模板文件
另外,蜘蛛對 robots.txt 本身的請求频率,也是一個還不错的观察窗口。如果日誌里這個文件的請求長期為零,通常說明蜘蛛對這批域名兴趣不大,或者根本没有走到這一步。
小结
robots.txt 是一份放行說明,不是防護措施。入口頁的原則很简單:能抓的就放行,明确没用的才屏蔽,別用屏蔽去實現本该由 noindex 完成的事。
它不會让蜘蛛多来几次,但寫错一次,可能让一批入口頁在很長時間里都處在無人問津的狀態。