robots.txt 管的是能不能来,不是能不能收錄
很多站長把 robots.txt 当成收錄開關,其實它只回答一個問题:蜘蛛可以請求站点上的哪些地址。它不负责让頁面被收錄,也不负责让頁面從搜尋结果里消失。被 Disallow 的地址如果已经被收錄,通常還會留在索引里,因為蜘蛛拿不到内容,無法確認该頁面已经消失或者该被移除。
想让頁面明确登出索引,用 noindex 更直接。想让蜘蛛別把抓取预算浪費在無意义的地址上,robots.txt 才合适。
User-agent 分组怎么匹配
文件由若干组构成,每组以一個或多個 User-agent 行開头,後面跟着規則行。蜘蛛一般只讀取與自己相關的那一组。
- 寫了具体名稱的分组優先于寫 * 的分组,针對某個蜘蛛的規則會覆盖通用規則。
- 同一组内有多條規則时,通常按路径匹配長度决定優先級,越具体的規則越優先,而不是简單按书寫先後顺序。
- 没有匹配到任何分组的蜘蛛,按 * 组處理;如果连 * 组也没有,一般视為無限制。
所以最後补一條 Disallow: / 就想兜底的想法要谨慎,分组之間的關系取决于具体實現,把通用規則和专項規則混在一起,容易出現和预期相反的结果。
通配符和目錄拦截的常见寫法
多數主流蜘蛛支持 * 和路径末尾的 $。前者表示任意字符序列,後者表示路径結束。
- Disallow: /search 會拦住所有以 /search 開头的路径,包括 /searching。如果只想拦搜尋頁,通常要寫 /search? 或配合 $ 使用。
- Disallow: /*? 用来拦带查询參數的地址,但可能誤伤真正需要被抓的詳情頁。改動前先看日誌里這些地址的抓取情况。
- Disallow: /*.pdf$ 只拦 PDF,不影响同目錄下的 HTML 頁面。
規則寫得越宽,越容易誤伤。動手之前先從服務器日誌里筛出實际被蜘蛛抓過的路径,再决定拦哪些,而不是凭感觉寫一條目錄級的 Disallow。
Crawl-delay 是不是調节抓取频次的好办法
Crawl-delay 的作用常被高估。它並非所有蜘蛛都支持:主流搜尋引擎中有的明确不支持,抓取节奏主要由站点响應速度和抓取预算自行調节;部分蜘蛛會讀取,但取值往往只是一個參考。
更實际的做法是让服務器自己扛住压力:缩短動態頁面的响應時間、给資料库和頁面加缓存、在高峰期收敛一些非必要接口的抓取。與其在 robots.txt 里寫一個很大的延迟值,不如把首字节時間降下来,蜘蛛在同一時間窗口里能抓的頁面反而更多。
几個容易踩的坑
- 用 robots.txt 屏蔽整站来做临时下线,蜘蛛抓不到内容,恢复之後重新建立抓取节奏要花時間。
- robots.txt 返回 5xx。這通常被当作服務器错誤,蜘蛛可能暫停抓取,也可能把已有的限制当作失效,風險比返回 404 更大。文件讀取失敗时要有可用的兜底。
- 把 Sitemap 地址寫在 robots.txt 里,却把 Sitemap 中的地址用 Disallow 拦掉,两處規則互相矛盾。
- 改版时忘了更新規則,舊目錄的 Disallow 還留着,而新目錄的地址正好落在里面。
- 用 Disallow 拦分頁頁和篩選頁,同时又在 Sitemap 里提交這些地址,让蜘蛛收到相反的信号。
什么时候该動 robots.txt
它适合處理三類問题:拦掉技術上抓取就出错或者没有任何内容的地址、向蜘蛛說明站点的抓取邊界、声明 Sitemap 的位置。它不适合處理的事情包括:让頁面被收錄、让頁面掉出排名、加速索引。
改 robots.txt 之前,先確認想拦的地址确實没必要被抓,並想清楚這些地址現在有没有被收錄、拦掉之後會發生什么。
改完之後观察一段時間的服務器日誌,看蜘蛛對這些路径的請求是否减少、有没有出現意外的 403、抓取總量有没有整体下滑,再决定是保留還是回退。一次只改一處,比一次性重寫整個文件更容易定位問题。