站内有些頁面不是編輯寫出来的,而是功能自動生成的:篩選、排序、日歷、站内搜尋结果。它們對用戶有用,但對蜘蛛来说可能是一條没有尽头的路。只要連結可抓取,蜘蛛就會把這些 URL 排進队列,一個個走進去。抓取预算是有限的,被這些頁面消耗掉,真正需要更新的内容反而排不上队。
無限 URL 空間從哪来
常见的来源有几類:
- 篩選與排序參數:?color=red&size=42&sort=price 這類组合,维度一多,URL 數量會成倍增長。
- 日歷與日期归档:/2024/03/15/ 這種路径可以不断生成,即使那天没有内容。
- 分頁叠加篩選:篩選结果里再分頁,每一頁都是新 URL,翻到最後也没有實质内容。
- 站内搜尋:搜尋结果頁本身可被抓取,查询词的组合又是無限的。
- 會话與追踪參數:带 session id、?ref= 之類參數的 URL 指向同一份内容,却让蜘蛛当成不同頁面。
蜘蛛為什么會一路走下去
蜘蛛没有“判断這個頁面有没有價值”的能力,它只認信号:URL 是否可抓取、是否有連結指向、頁面是否返回正常狀態。只要篩選連結在 HTML 里以 a 标簽出現,或者分頁的“下一頁”一直存在,它就會繼續排队。很多站点的篩選组合頁對用戶是空结果,但依然返回 200,蜘蛛無法区分這跟真實内容頁有什么不同。
怎么给這條路收口
先分清哪些參數值得留
不是所有參數都要開放。對内容有實质影响、且有獨立检索需求的维度,可以保留;纯排序、纯展示切換、時間戳類的參數,通常不值得單獨抓取。把它們從可抓連結里去掉,是最省事的一步。
robots.txt 與 robots meta 的分工
robots.txt 适合處理“整類路径不必抓”的情况,比如带特定參數的搜尋结果;但它只阻止抓取,不阻止 URL 被發現——如果別處有連結指向,地址還是可能進队列。對于需要被看到、但不该被索引的頁面,用 robots meta 的 noindex 更合适,前提是別在 robots.txt 里把整段路径屏蔽掉,否則蜘蛛讀不到 noindex。
挡住抓取和挡住索引是两件事,混用容易两头落空。
分頁不要全部指向第一頁
有的站点把所有分頁的 canonical 都寫向列表第一頁,想让蜘蛛只認一個地址。對真正存在的分頁内容来说,這會削弱後面几頁的可见性。更稳的做法是让分頁自指 canonical,同时在頁面里明确“下一頁”的關系,让蜘蛛知道它翻的是同一组内容的延續。
站内搜尋頁單獨處理
站内搜尋生成的结果頁,通常没有長期检索價值。用 noindex 让它們不參與索引,同时避免把搜尋框提交後的 URL 直接做成可抓連結。如果已经有大量搜尋 URL 被抓,可以在日誌里看它們的抓取占比,再决定是否收紧。
用 Sitemap 给一份正向清單
Sitemap 不一定能让蜘蛛马上抓,但它能告诉蜘蛛哪些 URL 是站点認可的。對于大站,把真正需要更新的内容放進 Sitemap,過滤掉參數组合頁,是一種把抓取预算往有用方向拉的办法。前提是 Sitemap 里的 URL 自身可抓、狀態正常,否則這份清單本身也會變成噪音。
监控與調整
調整後不看資料等于没調。可以在服務器日誌里按 URL 模式做简單分组,看參數頁、搜尋结果頁、日歷頁在總抓取量里的比例。如果某類 URL 抓取频繁但從未带来訪問,就值得检查它是否還在被内鏈暴露。反過来,如果重要内容抓取量下降,也要確認是不是收口收得過头,把蜘蛛挡在了有用的路径之外。
收口的目的不是禁止蜘蛛探索,而是让它在有限次數里走到有價值的地方。把無限生成的 URL 關在门外,剩下的路自然更清晰。