搜尋抓取

蜘蛛反复抓同一批 URL:抓取冗余的成因與收敛思路

蜘蛛每天来,抓的還是那几十個地址,新頁面却迟迟没人看——這往往不是抓取量不够,而是抓取冗余。本文拆解參數變体、canonical 缺失、時間戳信号、空壳頁等常见成因,並给出從日誌驗證到逐步收敛的實操思路。

搜尋抓取

蜘蛛反复抓同一批 URL:抓取冗余的成因與收敛思路

後台日誌里常能看到一種現象:蜘蛛每天都来,抓的却是同一批地址,翻来覆去,响應碼清一色 200 或 304,新上线的頁面反而隔很久才被碰一次。很多人第一反應是“抓取量不够”,于是去提交、去發外鏈,结果抓取總量上去了,冗余也跟着上去了。真正要處理的,往往不是量的問题,而是重复。

先分清两種重复

抓取冗余大致分两類。一類是同一份内容有多個可訪問地址,蜘蛛挨個抓;另一類是同一個地址被反复抓,但内容根本没變。前者浪費的是發現新 URL 的机會,後者浪費的是單次請求的時間。两類問题的處理方式不一样,先看日誌里哪種占比更高,再决定從哪下手。

常见的几種成因

參數與變体地址

篩選、排序、追踪、會话參數是重灾区。同一個列表頁因為 ?sort=、?from=、?utm_ 派生出成百上千個地址,頁面主体却几乎一样。如果這些地址都能返回 200,蜘蛛就會把它們当成獨立頁面排队。除此之外,大小寫混用、结尾斜杠忽有忽無、带不带 index 後缀,也會各自算作一個地址。

canonical 缺失或自相矛盾

頁面没有声明主版本,或者 A 頁指向 B、B 頁又指回 A,蜘蛛就無法確認该保留哪一個。它不會“猜”,只會繼續把几個版本都抓下去。内鏈里如果同时混用多個版本,等于在反复告诉蜘蛛“這几個都重要”。

频繁變動的時間信号

有些站点每次請求都動態生成目前時間戳,或者 Sitemap 里的 lastmod 天天刷新,但正文一個字没改。蜘蛛看到“刚更新過”的信号,自然會再来一趟。次數多了,它對這個信号的信任度也會下降。

空壳頁與占位内容

栏目下暂时没有内容、搜尋结果頁、标簽聚合頁,如果都返回 200 加一句“暂無資料”,蜘蛛抓到的東西几乎没有價值,却仍會按正常頁面安排回訪。這類地址越多,真正需要抓取的頁面分到的机會就越少。

收敛的几條主线

  • 统一内鏈寫法。站内所有指向同一頁面的連結,协议、域名、路径、斜杠、參數保持一致,別让蜘蛛從不同入口看到不同地址。
  • 明确主版本。每個可能重复的頁面给一個自指向的 canonical,並确保它指向的地址能正常訪問、内容一致。
  • 處理參數。無實际内容差异的參數,用 robots 規則拦掉抓取,或者在内鏈里彻底不带;有内容差异的,让它在頁面上可被识別為獨立頁面。
  • 减少空壳。無内容的聚合頁、搜尋结果頁,要么返回合适的 404 语义,要么直接不让蜘蛛進来。
  • 收紧提交范围。Sitemap 只放主版本和真正需要被發現的地址,別把參數變体一並寫進去,否則等于自己制造冗余。

這些動作不需要一次全上。建议按“日誌里出現次數最多的那一類”先改,改完观察一到两周,再决定下一步。

用日誌確認是否真的收敛

做完調整,不要只看“抓取總量變没變”。更有用的几個指标是:同一路径下的不同查询串數量是否下降、蜘蛛對同一 URL 的重复抓取間隔是否拉長、304 與 200 的比例變化、以及新 URL 從上线到首次被抓的間隔是否缩短。這几個資料一起看,才能判断抓取是變“精”了還是只是變“少”了。

抓取冗余的排查,本质是回答一個問题:蜘蛛看到的地址數量,和站点真實需要的地址數量,差了多少。差距越小,留给新内容的抓取机會就越多。

最後提醒一点:冗余收敛是渐進過程。蜘蛛對站点结构的印象是長期积累的,改完内鏈和 canonical 之後,它可能還會按老习惯再抓一阵子。给這個過程留出观察周期,比频繁改動配置更有效。