很多站点上线站内搜尋和篩選功能之後,服務器日誌里很快會出現大量带參數的 URL。這些頁面用戶用得並不多,蜘蛛却爬得很勤。它們内容重复、组合近乎無限,容易把有限的抓取時間占掉,真正需要更新的文章和商品反而被挤到後面。
先確認這些頁面到底被抓了多少
不要凭感觉判断。打開訪問日誌,按 URL 里的參數關鍵詞做一次統計,常见的參數名包括 q、s、keyword、search、sort、order、filter、page、price、tag 等。重点看几件事:
- 同一路径下的參數组合數量是否在持續增長;
- 蜘蛛每天在這些 URL 上的請求占全部請求的比例;
- 這些請求返回的狀態碼分布,是 200 居多還是 404、302 居多;
- 是否有參數頁被外部連結指向,導致蜘蛛反复回訪。
只有拿到這些數字,後面的取舍才有依據。占比不到百分之一和占比超過三成,處理方式完全不同。
结果頁的三種處理思路
直接屏蔽抓取
在 robots.txt 里屏蔽带特定參數的搜尋结果頁,是最直接的做法,能較快减少抓取浪費。但要清楚一個前提:被屏蔽的 URL 如果被外鏈引用,仍可能以無描述的形式出現在搜尋结果里,因為蜘蛛讀不到頁面上的說明标记。屏蔽解决的是抓取問题,不是索引問题。
允许抓取但标记 noindex
如果希望這些頁面既不進索引、也不留下無描述收錄,可以让蜘蛛正常抓取,由頁面自己輸出 noindex。代價是抓取成本依然存在,适合參數组合數量可控、總量不大的站点。
把有價值的篩選頁拆出来單獨维護
有些篩選组合對應的是真實需求,比如某個城市加某個品類的列表頁。這類頁面可以做成固定路径的静態入口,配上獨立的标题、简介和内容摘要,從搜尋结果頁体系中分离出来單獨维護。其余的随机组合繼續用規則挡在外面。判断标准很简單:這條组合有没有人主動搜尋過,頁面上的内容是否與主列表頁明顯不同。
站内搜尋頁要額外注意两点
- 搜尋框的提交方式。纯 GET 表單會把用戶每一次輸入都變成一條可抓取的 URL,有些蜘蛛甚至會主動拼接常见關鍵詞。改為 POST 提交,或者限制搜尋入口只對站内交互開放,能减少大量無意义的地址。
- 空结果頁的處理。搜不到内容时不要用一個 200 狀態碼加上一句没有找到就結束,可以根據關鍵詞推荐相關栏目或热门内容,避免留下大量空壳頁面。
參數组合尽量收敛
排序方式、列表视图、每頁條數這類參數本身不产生新内容。可以在程序层限制有效取值范围,過滤掉非法取值;同时合並等價的參數寫法,避免 sort=price 和 order=price 這類同义不同名的地址同时存在。參數越少,可组合出的 URL 就越少,蜘蛛遇到的岔路也就越少。
一份可执行的检查清單
- 統計日誌中带參數 URL 的抓取量和占比;
- 列出所有參數名,标注每個參數是否影响頁面主体内容;
- 對不影响内容的參數组合設定 robots.txt 規則或 noindex;
- 检查參數頁的 canonical 是否指向了合适的規范地址;
- 检查模板和内容区是否有大量連結直接指向參數頁;
- 調整後隔一到四周回看日誌,對比抓取分布的變化。
別忘了内鏈這一环
很多參數頁之所以被频繁抓取,是因為模板里到處挂着带篩選條件的連結,比如相關推荐、标簽云、猜你喜欢直接拼上參數。這類連結要么改成指向稳定的栏目頁,要么控制數量,不要在每個頁面都重复出現。連結少了,蜘蛛自然會把注意力收回到主干内容上。
參數頁面本身不是错誤,問题在于让蜘蛛把時間花在近乎無限的组合上。先分清哪些是有價值的入口,其余的用規則挡在抓取之外,比等到抓取出現異常再补救要省力得多。
調整之後不必期待第二天就看到變化,蜘蛛的抓取习惯通常需要几周才會平滑下来。把日誌回看變成固定動作,比一次性設定完就長期不管更靠谱。