很多網站為了提升用戶体驗,都會在頁面顶部或侧邊栏設定站内搜尋框。這本身没有問题,可如果站内搜尋生成大量動態URL,並且被搜尋引擎蜘蛛追踪,就會在不知不觉中挤占真正重要的URL發現机會。
比如一個内容站的站内搜尋地址形如 /search?keyword=春节&page=2,關鍵詞一旦组合,理论上可以衍生出几十萬甚至上百萬個網址。蜘蛛池的模拟抓取日誌里,经常能看到這種毫無意义的請求:它們不断改變參數,訪問大量搜尋结果頁面。這些頁面除了一段列表摘要,並没有實质性内容,既不會帮助用戶理解網站主题,也几乎不可能带来搜尋流量。但蜘蛛却以為它們是普通頁面,浪費時間反复抓取。
一、抓取挤占是如何發生的
搜尋引擎蜘蛛發現一條新URL後,會依照連結關系繼續爬行。如果某個搜尋结果頁面被收錄了,它上面又往往没有太多連結,很快蜘蛛就會放弃,但關键問题在于蜘蛛尝试建立的索引條目數量是有限的。假设一個站点每天的總抓取配額是1萬條,站内搜尋URL占去一多半,那么频道頁、詳情頁的抓取深度就會明顯下降。
更隐蔽的地方在于,有些站内搜尋框使用了AJAX自動补全,或者頁面本身带有“虚拟URL”,即使没有真實連結,蜘蛛也可能通過javascript渲染發現這些地址。我們曾用蜘蛛池模拟了某個新闻站的抓取,在不到半小时内,蜘蛛池返回的抓取记錄里就出現了三千個不同關鍵詞的搜尋頁請求,而首頁和栏目頁的占比反而只有几百次。
容易被忽视的细节
- 站内搜尋框的頁面源碼里如果存在 action 属性直接指向搜尋接口,蜘蛛有概率通過表單尝试。
- 部分站点在文章詳情頁正文底部展示“热门搜尋關鍵詞”,這些词如果被做成带連結的标簽,也會吸引蜘蛛点過去。
- 如果搜尋结果是分頁顯示的,那么“下一頁”“第N頁”的連結會繼續引導蜘蛛深入,让URL規模成倍扩大。
二、用蜘蛛池做一次查驗
运营人員不必等到搜尋引擎日誌里出現異常再去排查,可以主動用蜘蛛池模拟抓取站点首頁和几個關键频道頁,設定好用戶代理,让模拟蜘蛛按照真實蜘蛛的路径爬行。随後打開蜘蛛池的抓取URL明细,重点查看有没有包含 /search?keyword= 或 /s?word= 之類特征串的地址。
同时也观察一下這些被請求的搜尋頁返回的HTTP狀態碼。如果返回200,說明搜尋引擎認為它們是有效頁面;如果返回404或带noindex,多次請求會自動减少。蜘蛛池的統計中,若發現搜尋頁請求占比超過總抓取數的15%,就该引起注意了。
几種典型異常
- 搜尋词不分大小寫,關鍵詞重复出現,但URL里带了随机值,導致無法归一。
- 搜尋结果頁的URL參數中带有關鍵詞本身,比如 /search?keyword=蜘蛛池&tag=ABC,實际只要第一個參數就够。
- 站内搜尋頁在架构上是有翻頁的,但robots没有屏蔽翻頁參數,蜘蛛不断抓取第1頁到第100頁。
注意:蜘蛛池只是辅助排查的工具,它模拟的抓取行為越接近真實蜘蛛越好,但最终還是需要以搜尋引擎站点平台的抓取統計為准。
三、隔离與引導的操作要点
1. robots层:直接禁止搜尋頁
在robots.txt中明确加入這样一行:
/search注意需要根據站点的實际路径寫,如果搜尋入口是“/so/index.php?q=”,那么就寫成 Disallow: /so/。別遗漏带协议的绝對路径形式。
2. 頁面层:给搜尋结果加 noindex
如果為了將来做資料监控,不希望直接禁止抓取,那么可以使用robots meta或 X-Robots-Tag 头。给站内搜尋頁统一輸出 <meta name="robots" content="noindex,follow"> 也可以,但要注意這样仍然會消耗部分抓取资源,因為蜘蛛照样来訪問發現它于是再离開。最稳妥的做法是robots层禁止,同时保留noindex作為兜底。
3. 連結层:防止诱饵
站内所有指向搜尋结果頁的連結,都應该加上 rel="nofollow"。尤其是热门搜尋词区块和搜尋框下方的“高級搜尋”連結,這些是蜘蛛最常循着走的地方。
四、驗證和處理
設定完成後,再用蜘蛛池模拟抓取一次。注意观察蜘蛛池是否能抓到 /search 下面的地址,正常的抓取日誌里應该不再出現這類记錄,或者至少數量大幅下降。同时也要检查首頁、栏目頁、詳情頁的有效抓取占比是否有所回升。
如果發現還在抓取,就要检查是不是有別的頁面泄露了搜尋頁的連結,例如我們寫過判断脚本,专门提取頁面里包含“?keyword=”的連結。把這些鏈路断掉,就能恢复健康的抓取结构。
通過這样一個梳理,可以發現站内搜尋頁的挤占問题並不难解决,但需要运营人員對搜尋蜘蛛的發現机制保持敏感。搜尋引擎重视有價值的單位内容,URL發現依靠的是連結與抓取路径,保證站内搜尋頁不再干扰主要頁面的爬取,我們的栏目和文章才有更多机會被蜘蛛看见。