搜尋抓取

robots.txt 划下的邊界:哪些路径被剪掉,蜘蛛自己不會说

robots.txt 决定的是蜘蛛能不能抓某個 URL,而不是這個 URL 會不會出現在搜尋结果里。本文拆開這两個概念,讲清 Disallow 带来的 URL 發現與内鏈损耗、通配符與 Allow 的匹配顺序、CSS/JS 被誤挡的後果,以及 robots.txt 自身返回 5xx 或超时對抓取的影响,並给出一份可逐條核對的检查清單。

搜尋抓取

robots.txt 划下的邊界:哪些路径被剪掉,蜘蛛自己不會说

robots.txt 常被当成一個“藏東西的地方”,但它實际是抓取通道的第一道闸门。它决定的是蜘蛛能不能下载某個 URL,而不决定這個 URL 會不會出現在搜尋结果里。這两件事被混在一起,是很多抓取問题的起点。

一、抓取與收錄是两件事

Disallow 只阻断抓取。如果一個被禁的 URL 從站外拿到了連結,搜尋引擎仍可能把它收進索引,只是没有摘要、没有正文,用戶点進去看到的是一個空壳结果。反過来,想让某個頁面不被收錄,正确顺序是让它能被抓取,然後由頁面返回 noindex;如果既 Disallow 又 noindex,蜘蛛讀不到那行 noindex,目的就落空了。

二、一條 Disallow 的真實成本

当整個目錄被屏蔽,蜘蛛不抓這些頁面,也就不會顺着頁面里的連結繼續往下走。代價有两层:這些 URL 本身很难被發現;被它們指向的下游頁面,也少了一條内鏈入口。所以在批量加規則之前,先看一眼被禁目錄里有多少條連結通向你還想被收錄的頁面。測試站全站屏蔽、上线时忘了删規則,是這類事故里最常见的一種。

三、通配符、Allow 與匹配顺序

  • *:匹配任意長度的字符序列。
  • $:表示 URL 到此結束,用来区分 /a 和 /a.html 這類後缀。
  • Allow 與 Disallow 都能匹配时,按最長匹配優先;規則長度相同时 Allow 優先。具体行為建议以官方文档和實测為准。

几種常见寫法與它們的代價

  • Disallow: /search:屏蔽站内搜尋结果頁,多數情况下合理;但如果站内搜尋頁有稳定的自然流量词,可以考虑只屏蔽结果參數,而不是整個目錄。
  • Disallow: /*?:一刀切掉所有带參數的 URL,顺带把分頁、排序和追踪參數一起砍掉。用之前要想清楚哪些參數頁是要留的。
  • Disallow: /*.js$ 與 /*.css$:蜘蛛拿不到渲染所需的资源,由 JS 生成的連結和内容可能就看不见了。

四、robots.txt 自己也會坏

這個文件本身也有狀態碼。返回 404,通常等同没有限制,全部可抓;返回 5xx,蜘蛛一般會先按“暂时全部允许”處理,過一段時間再来確認。如果它長期超时或持續报错,抓取的稳定性就會受影响。所以別把它放在临时重定向後面,也別让 CDN 的規則把它拦掉——它的可用性值得和首頁同等對待。

五、關于 Crawl-delay

Crawl-delay 是被多數主流搜尋蜘蛛忽略的字段。真正影响抓取节奏的是站点响應速度和服務器承载能力。想把抓取压下来,更可靠的做法是减少慢頁面和無用參數頁的入鏈,而不是在 robots.txt 里寫一個期望值。

六、可以逐條核對的清單

  1. robots.txt 返回 200,纯文本,没有被 HTML 包裹。
  2. Sitemap 里的 URL 没有被 Disallow 掉。两邊矛盾时,抓取通常以 robots.txt 為准。
  3. CSS、JS、图片目錄處于放行狀態。
  4. 需要保留訪問、不想收錄的頁面,用 noindex 處理,而不是 Disallow。
  5. 規則調整後,用官方測試工具加日誌一起驗證,確認蜘蛛走的是你预期的路径。
規則寫得越粗,蜘蛛手里的地图就越像被剪過——不是走不通,而是很多本来该去的地方,從来没被标出来。