搜尋抓取

robots.txt 的邊界:放行、拦封與抓取频控怎么寫

robots.txt 是站点對蜘蛛的第一道约定,但它管的是抓取范围與节奏,不是收錄開關。本文梳理 Allow 與 Disallow 的匹配细节、抓取频控的局限、Sitemap 声明的寫法、常见誤封清單,以及改完之後如何用日誌驗證效果。

搜尋抓取

robots.txt 的邊界:放行、拦封與抓取频控怎么寫

robots.txt 是站点與蜘蛛之間最早生效的一份约定。它放在域名根目錄下,用来告诉蜘蛛哪些路径可以抓、哪些先別抓,以及 Sitemap 放在哪里。它不负责收錄,也不等于“屏蔽搜尋引擎”。把它当成抓取范围與抓取节奏的調节阀,才用得稳。

它管的是抓取,不是收錄

被 Disallow 拦住的 URL,原則上不會被蜘蛛請求,因此也就没有机會被抓取和後續處理。但反過来,放開抓取也不代表一定被收錄——收錄還要看内容质量、重复度、頁面是否可訪問。常见誤区是:為了“让頁面收錄”去删掉 Disallow,结果反而放進来一批低质或重复地址,把抓取量消耗掉。

Allow 與 Disallow 的匹配規則

主流蜘蛛基本按路径前缀匹配,顺手把几個容易踩的细节列一下:

  • Disallow: /tmp/,會同时拦住 /tmp/ 與 /tmp/a/b.html,但未必拦住 /tmpfile,因為前缀到斜杠為止。
  • 通配符 * 和结尾符 $ 在主流蜘蛛上普遍支持,但小众采集器可能直接忽略,別把它們当作唯一防线。
  • 路径区分大小寫。寫成 /Search/ 而實际目錄是 /search/,等于没拦。
  • 寫成 Disallow: / 會拦住整站,包括首頁。這一條只适合临时全站维護。
  • Allow 的優先級通常高于 Disallow,可以先用 Disallow 收窄大目錄,再用 Allow 放行其中某個子目錄。

抓取频控:Crawl-delay 只是建议

很多人想用 Crawl-delay 直接把蜘蛛訪問频率压下来。需要注意两点:其一,它並非所有蜘蛛都認,部分主流蜘蛛早已不讀取這一行;其二,即便讀取,也只是建议值,站点响應慢或抓取需求高时仍可能被突破。

真正影响抓取节奏的,更多是服務器响應速度、错誤率和你自己的内容更新频率。如果某些接口压力大,用 robots.txt 拦住對應路径,比調 Crawl-delay 更直接有效。

把 Sitemap 寫進 robots.txt

在文件里加一行 Sitemap 声明是成本很低的做法,能让蜘蛛在同一個位置拿到清單入口。寫法上注意几点:

  • 用完整绝對地址,包含协议與域名。
  • 地址必须與目前 robots.txt 所在域名一致,跨域名声明通常不會被采用。
  • 可以寫多條,用于分片或多個子域的 Sitemap。
  • Sitemap 里只放可抓取的規范地址,別把已经 Disallow 的 URL 又寫進去,逻辑上自相矛盾。

常见的誤封清單

下面這些场景,日誌里经常表現為抓取量突然腰斩:

  1. 模板上线时顺手複製了測試环境的 robots.txt,把生产目錄拦了。
  2. 為了挡住搜尋结果頁或篩選參數,顺手把整個列表目錄拦掉,導致詳情頁失去發現入口。
  3. 拦住 CSS、JS 所在目錄,頁面能抓但渲染受限。
  4. 把 /uploads/ 之類静態资源目錄整体拦掉,图片與附件不再被抓取。
  5. robots.txt 本身返回 404 或 500,不同蜘蛛的處理策略不一致,结果难以预期。

改動之後怎么驗證

改完不要只看文件内容,回头看日誌更實在:

  1. 確認 robots.txt 返回 200,且内容是你刚改的版本,注意 CDN 或缓存层是否還留着舊文件。
  2. 观察改動後一到两周内,被拦路径的請求量是否下降到接近零。
  3. 观察放行路径的請求量是否上升,有没有出現大批無意义的參數地址。
  4. 核對 Sitemap 中的 URL 是否都在允许范围内,抓取比例是否正常。
小提示:robots.txt 生效有延迟,蜘蛛不會立刻按新規則执行。改動後给出足够观察窗口,再判断是否達到了预期,避免频繁来回修改。

和其它控抓手段的分工

robots.txt 只是入口层的一环。具体到單頁层面,可以用 meta robots 或响應头 X-Robots-Tag 控制索引與跟随;已经下线的頁面交给 301、404、410 去表達狀態;临时限流交给 429、503 加 Retry-After。几层各管一段,配合使用比指望一個文件解决全部問题更靠谱。