蜘蛛抓取一個站点,第一件事往往不是取首頁,而是先取根目錄下的 robots.txt。這個文件不决定頁面能不能排名,但它决定蜘蛛有没有去請求某條 URL 的资格。規則寫错一行,可能让整站目錄、模板资源或者某個子站從抓取路径上消失,而且改動不會立刻生效。
robots.txt 的讀取與缓存
主流搜尋引擎在抓取前會讀取 robots.txt,並把结果缓存一段時間,通常是几個小时到一天不等。修改文件之後,蜘蛛可能還在用舊規則,尤其是被誤屏蔽的目錄,恢复抓取往往比屏蔽更慢。所以上线新目錄、改版切流這類操作,最好在推動抓取之前就把 robots.txt 調整好。
另外,蜘蛛一般只讀取域名根目錄下的 robots.txt,子目錄里的同名文件不會生效。用子域名部署的站点需要各自维護一份。
基础语法與匹配的優先級
- User-agent:指定規則适用的爬虫,User-agent: * 表示所有爬虫。存在多個分组时,蜘蛛會選擇與自己名稱最匹配的那一组。
- Disallow:禁止抓取的路径前缀,Disallow: / 等于整站禁抓,寫成 Disallow 但路径留空則等于不限制。
- Allow:在被禁止的目錄里開一個口子,比如先禁掉整個目錄,再用 Allow 放開其中一部分。
- 通配符:星号匹配任意字符,美元符号匹配結束位置,可以用来精确限定带參數的 URL。
- Sitemap:可以在這里声明站点地图地址,但它是獨立指令,和 Allow、Disallow 不属于同一類規則。
匹配时通常遵循“最長路径優先”,路径更長、更具体的規則胜出;路径長度相同时,Allow 一般優先于 Disallow。不同爬虫的實現细节略有差別,規則越简單越不容易踩坑。
最容易被挡错的三類资源
第一類是 CSS 和 JS 目錄。把静態资源目錄整体禁抓,看起来是让蜘蛛少抓点文件,實际會让渲染出的頁面缺样式、缺内容,蜘蛛看到的可能是一個不完整的版本。第二類是图片和附件目錄,被挡住之後图片搜尋的入口也就断了。第三類是分頁或篩選參數,本想节省抓取額度,结果把正常的内容列表也一並挡掉。
更稳妥的做法是先用日誌確認哪些目錄真的在被大量重复抓取,再针對具体路径下手,而不是一上来就禁掉整個目錄。
Disallow 不等于 noindex
這是最常见的誤解。被 robots.txt 挡住的 URL,蜘蛛拿不到内容,也就讀不到頁面里的 noindex 标记。结果可能出現:這條 URL 因為外部連結或其他信号仍然出現在搜尋结果里,只是没有摘要和快照。
如果目标是让頁面彻底登出索引,就不要用 robots.txt 挡它,而是让蜘蛛抓到頁面並讀到 noindex。反過来,一條已经被禁抓的 URL,再加 noindex 是無效组合。两個工具管的是不同阶段:robots.txt 管“能不能抓”,noindex 管“抓到之後要不要留”。
robots.txt 自身出問题會怎样
如果 robots.txt 返回 404,蜘蛛一般视為没有限制,繼續正常抓取;如果返回 5xx 或者连接超时,多數搜尋引擎會保守處理,暫停或降低抓取,避免誤闯不该抓的地方。所以不要把 robots.txt 做成依赖資料库或動態脚本輸出的文件,静態返回最稳。也不要让它參與重定向鏈,更不要指望用 JS 渲染出来。
Crawl-delay 和限速
Crawl-delay 是部分爬虫接受的约定,主流搜尋引擎並不遵循它。真正想控制抓取压力,通常是通過服務器响應速度、日誌观察和搜尋引擎提供的抓取速率設定来調整。與其在 robots.txt 里寫一個没人遵守的數字,不如把首頁和列表頁的响應時間控制好。
上线前後的检查清單
- 確認根目錄 robots.txt 返回 200,内容是纯文本。
- 检查是否誤挡了 CSS、JS、图片目錄。
- 需要屏蔽的路径是否用了最短、最明确的前缀寫法。
- 打算移除索引的頁面,不要放進 Disallow。
- 站点地图里提交的 URL 不要和 Disallow 規則互相冲突。
- 改動之後隔一段時間再看日誌,確認蜘蛛是否按新規則訪問。
robots.txt 是给守規矩的爬虫看的约定,不是權限系統。真正需要保護的内容,應该放在登入之後,而不是指望一個文本文件挡住。