做站点运营,大家习惯先看蜘蛛来没来、来了多少。但還有一個更隐蔽的問题:蜘蛛来了之後,會不會被頁面上的某些入口带進無穷無尽的地址里。這類结构通常被称為爬虫陷阱,它不报错、不报警,只是安静地消耗抓取预算,让真正需要被發現的頁面排不上队。
爬虫陷阱長什么样
判断某個入口是不是陷阱,可以看三個特征:地址數量是否由參數组合無限放大;頁面内容是否高度重复;是否存在只有蜘蛛會一路点下去、對真實用戶几乎没價值的路径。只要满足其中两條,就值得單獨拉出来看看。
需要重点检查的五類入口
日歷與日期導航
文章归档、活動日歷、排班表這類组件,常见做法是按年、月、日逐級展開。問题在于每一級都會生成一個新地址,而空日期的頁面往往只有一句“暂無内容”。一年三百六十五天,几年下来就是上千個几乎相同的頁面。
會话 ID 與跟踪參數
有些程序會把 sessionid、sid 之類的标识直接拼在地址上,同一個栏目頁因此出現几十個版本。外部投放带来的 from、ref、utm 參數如果被服務端接受並正常返回 200,也會制造同样的問题。這類地址通常内容是完整的,因此更容易被当成獨立頁面處理。
组合篩選與多級排序
列表頁提供颜色、價格、地区、排序方式等多個篩選項时,可组合的數量是乘积關系。十几個選項就能拼出成千上萬個地址。如果這些组合頁面没有做參數規范,也没有限制可被抓取的范围,蜘蛛很容易在里面越走越深。
無限滚動與“加载更多”
纯前端追加内容、地址栏却不變,通常不會产生新地址,風險相對小。真正麻烦的是每加载一批就寫入一個新的參數或路径,或者滚動到底部时連結指向的是下一批資料的地址。此时内容在持續增加,但没有任何一頁被明确标记為终点。
站内搜尋的联想與空结果
搜尋框的輸入联想、热门词推荐、搜尋结果的二次篩選,都可能被拼成新地址。尤其是空结果頁,常常返回 200 加一句提示,重复度极高。這類地址一旦被大量收錄,會明顯拉低站点的整体质量观感。
一份可执行的自查清單
- 在服務器日誌里按目錄分组,找出被抓取次數最多、但内容重复度最高的那一批地址,看看它們是怎么被發現的。
- 随机挑几個可疑地址,手動去掉參數、改改參數顺序,確認是否返回同一份内容。
- 检查這些地址是否在站点地图、内鏈、面包屑或頁脚中被主動指向——如果是,先切断入口。
- 確認它們的返回狀態:该 404 的返回 404,该 301 的跳轉到規范地址,不要一律返回 200。
- 在 robots.txt 中屏蔽明顯的组合參數或日歷目錄,但要先確認屏蔽不會誤伤正常頁面。
- 一周後再看一次日誌和抓取分布,確認這批地址的請求量确實在下降。
處理时把握几個原則
- 優先断入口,再谈屏蔽。如果内鏈還在源源不断指向陷阱,單靠 robots.txt 只是让蜘蛛在门口反复试探。
- 能合並就合並。篩選组合本身有用戶價值时,保留主要组合,把長尾參數收敛到規范地址上。
- 给分頁一個终点。明确最後一頁,不要让“下一頁”永遠有内容。
- 狀態碼要诚實。空结果、不存在的组合、已下架的頁面,分別用合适的狀態碼回應,而不是统一返回 200。
- 小步改動,观察後再繼續。一次改太多,出問题时很难判断是哪一步引起的。
爬虫陷阱的麻烦之處不在于它有多嚴重,而在于它長期存在却很少被注意。定期花半小时翻一遍日誌里的高频地址,往往比事後补救更省事。
抓取预算是有限的,蜘蛛在一個站点上停留的時間也是有限的。把那些無限延伸、内容空轉的地址收拢起来,省下的部分自然會流向栏目頁和内容頁。這件事没有立竿见影的效果,但它是站点运营里少數可以長期保持的動作之一。