讨论蜘蛛池时,多數人關心的是爬虫来不来,很少有人關心爬虫来了之後是不是被困住了。實际上,一個入口頁只要存在某類结构,爬虫就可能在同一個小站里兜圈子,把有限的訪問次數耗在無意义的頁面上,而真正需要被發現的 URL 一直排不上队。
蜘蛛陷阱在蜘蛛池语境下的含义
搜尋引擎優化里说的蜘蛛陷阱,通常指那些會生成無限多 URL、或者让爬虫反复循环的頁面结构。放到蜘蛛池里,這個問题會被放大:入口頁本身就是為被發現而存在的,如果它同时還是一個陷阱,那么爬虫每次到訪都只是在原地打轉,信号没有往外传,反而被内部消化掉了。
入口頁上常见的几種陷阱
無限分頁與下一頁鏈
列表頁一路下一頁接到天荒地老,頁碼可以点到几千頁,這是最经典的一種。即使你在 robots.txt 或連結属性上做了限制,也建议在服務端直接收敛:超過某個頁數之後不再輸出下一頁連結,或者干脆返回 404,让循环有明确的尽头。
日歷、篩選與排序參數
带日期、價格排序、多重篩選的入口頁,可组合出来的 URL 數量是乘級的。爬虫會顺着這些组合一路抓下去,很快就触到给自己设定的上限。對蜘蛛池来说,入口頁的职责是摆出目标 URL,而不是把自身變成一個巨大的可抓取集合。把篩選结果收敛成少數几個静態路径,能省掉很多無谓的往返。
無限滚動與纯 JS 加载
頁面往下滚就自動加载,但 HTML 源碼里没有任何連結,或者連結完全由脚本拼出来。不同爬虫的渲染能力差別很大:渲染能力强的能把内容抓回去,能力弱的只看到一個空壳。所以入口頁上的連結最好是源碼里就能讀到的 a 标簽,滚動加载只作為补充体驗。
session id 與跟踪參數
每次訪問都往 URL 上挂一個 sid 之類的參數,同一份内容就有了無數個地址。爬虫會把它們当作不同頁面反复抓取,抓取预算被迅速稀释,而且很难自己走出去。
软 404 與空白頁
返回 200 但頁面没有實际内容,或者只有一句暂無資料。爬虫無法判断這是有效頁還是空壳,長期如此,站点整体的抓取優先級容易往下走。
陷阱的代價不只是抓取预算
抓取预算是直接的损失,但更麻烦的是信号层面的問题:爬虫在陷阱里绕得越久,從你的入口頁跳到下一個目标 URL 的概率就越低。蜘蛛池的價值在于把爬虫引導到新 URL,一旦入口頁變成了终点,它就從桥梁變成了墙。
判断一個入口頁是否合格,可以用一句话概括:爬虫訪問它之後,有没有多拿到一個之前不知道的 URL。
上线前可以做的自查
- 頁面上的連結,在禁用脚本的情况下還能不能被讀到;
- 翻頁、篩選、排序這几類结构,是否會产生大量可被抓取的组合 URL;
- 同一份内容是否存在多個带參數的地址;
- 空列表頁返回的是 200,還是 404 或 410;
- 從入口頁出發,三步之内能不能走到目标 URL。
一点使用建议
蜘蛛池不是越大越好,入口頁也不是越花哨越好。结构简單、連結可讀、路径短,通常比堆功能更能让爬虫顺畅通過。需要說明的是,做到這些只是减少無谓损耗,並不代表目标頁面一定會被收錄,最终结果仍然取决于目标站点自身的内容质量與搜尋需求。把陷阱清理干净,只是让爬虫的每一次到訪不至于白跑。