做站的人大多遇到過這種情况:站点實际頁面數量並不夸張,抓取日誌里却能翻出成千上萬條 URL,其中一大半是同一篇内容後面挂了一串問号參數。蜘蛛並不笨,它只是先按 URL 去抓。參數一多,等于给同一篇内容開了很多扇门,抓取量就這样被分掉了。
一個參數就是一條新 URL
對爬虫来说,URL 是頁面的身份标识。只要查询串的键或值不同,它就只能当作不同的地址去訪問。同一篇文章加上 ?utm_source=weibo、?from=share、?ref=pc,在日誌里就是三條记錄,抓取、渲染、入库的成本都要重复支付一次。
- 分享按钮自带的 utm 或 from 參數;
- 站内搜尋、篩選、排序生成的查询串;
- 广告投放與联盟带来的落地頁參數;
- A/B 測試、版本号、時間戳類的調试參數;
- 分頁或文章列表里被顺手拼上的跟踪字段。
這些參數大多是给統計工具看的,對頁面内容没有任何影响,但對抓取路径的影响很直接。
參數 URL 带来的三层影响
稀释抓取配額
蜘蛛在單位時間内愿意訪問的 URL 數量是有限的。当同一批内容以數百種參數形態存在时,被訪問的額度有相当一部分會消耗在重复頁面上,真正需要更新的新頁面反而排到了後面。
重复内容與信号分散
多個參數版本内容几乎一致,站内指向這些版本的連結也不统一,蜘蛛看到的是一组高度相似的頁面,而不是一個明确的主版本。主版本的抓取频率、内鏈權重都會因此被摊薄。
路径變長,日誌难讀
參數還會带来鏈式跳轉:带參頁面指向另一個带參頁面,連結越爬越散。日誌被大量相似 URL 淹没之後,你很难判断哪些頁面是真的被冷落了。
處理顺序:先收敛,再屏蔽,最後才谈提交
- 收敛来源。分享组件、广告落地頁、站内推荐位统一去掉無意义的跟踪參數,或让參數只在統計脚本里讀取,不寫進連結地址。
- 固定規范版本。選一個不带參的 URL 作為主版本,頁面上的 canonical 指向它,内鏈、Sitemap、面包屑也都只寫干净地址。
- 区分有無價值的參數。篩選、分頁這類會影响頁面内容的參數,如果确定要參與索引,就给它稳定的規范地址;如果只是临时组合,考虑用 robots 或頁面上的 noindex 處理。
- 最後再考虑屏蔽。robots.txt 里屏蔽參數並不等于 URL 不存在,蜘蛛仍可能從外鏈發現它,只是不抓取。若這些參數 URL 有外部連結,屏蔽會连带损失連結信号,需要按實际情况權衡。
要提醒的是,屏蔽是省事但粗糙的手段。它會让你同时失去對這批 URL 的抓取與观察,日誌里只剩“已發現未抓取”,排查时反而缺少线索。能用規范 URL 解决的部分,尽量不用屏蔽来解决。
把規范版本固定成預設寫法
真正有效的做法是让干净 URL 成為站内預設寫法:導航、正文内鏈、相關推荐、分頁组件、Sitemap 全部輸出無參地址;統計參數交给前端脚本或統計平台自動识別,不再拼進 href。這样蜘蛛從任何入口進站,看到的都是同一套地址,重复抓取自然减少。
如果分頁或篩選必须保留參數,至少让同一组條件只有一個可訪問的地址,並让頁面自身的 canonical 與内鏈保持一致,而不是让每一條篩選组合都變成獨立入口。
用日誌驗證效果
- 統計日誌中带問号 URL 的占比,看它是否在逐步下降;
- 检查參數 URL 的抓取频次,確認蜘蛛訪問重心回到主版本;
- 對比處理前後被抓取 URL 的總數與去重後的數量;
- 观察新發布頁面的首次抓取間隔是否缩短。
參數問题很少一次清干净,通常是一批改完,新模块上线又带進来一批。把“内鏈只寫規范地址”当成上线检查項,比事後從日誌里翻找要省力得多。