有些蜘蛛池或内頁分發系統為了把連結“均匀”分给爬虫,會让入口頁每次請求都返回一组不同的連結:服務端随机抽取、按時間片轮換,或者判断 UA 後輸出不同 HTML。人工訪問时看不出問题,但對搜尋蜘蛛来说就變成一個很實际的問题:蜘蛛每次只看到入口頁的一份抽样,剩下的目标 URL 由谁来發現?
搜尋蜘蛛看到的是哪一份 HTML
搜尋蜘蛛抓取入口頁时,拿到的只是那一次請求返回的 HTML。它不會像人一样反复刷新,也不會對比今天這份和昨天那份有什么不同。所以:
- 如果轮換范围小于單次返回的連結數,蜘蛛一次就能拿全,轮換本身影响有限。
- 如果每次只返回全量的一小部分,蜘蛛要在多次重訪中逐步拼出全量,能否拼完取决于它愿意来多少次。
- 如果每次抽出的連結池完全不同、舊連結不再出現,没被抽中的 URL 就很难再获得新的發現入口。
三件事决定能不能發現全
1. 入口頁的重訪频率
入口頁被重新抓取的間隔,通常和它的更新频率、站点整体權重、抓取配額有關。如果轮換策略假设蜘蛛每天来十次,而實际它一周只来一两次,排在队尾的連結就會一直等不到机會。
2. 每份 HTML 的連結數量
一頁塞太多連結會稀释每條連結的分量,被發現和後續抓取的概率都會下降。更稳的做法是單頁控制在合理條數,並让重要目标 URL 出現在多份抽样里,而不是只出現一次。
3. 連結是否稳定可复現
如果目标 URL 有規律、可以從已有連結推導出来,蜘蛛這次没看到也還有別的机會。如果 URL 完全随机、只靠入口頁輸出,那就只能依赖入口頁被反复抓取。
几種實現方式的差別
- 服務端随机:蜘蛛拿到什么看运气,稳定性最差,需要靠高频重訪弥补。
- 按時間片轮換:比如每小时切換一组,相對可控,但要注意抓取時間点是否總落在同一時間片里。
- 前端 JS 插入:連結不在初始 HTML 中,能否被發現取决于渲染抓取是否执行、执行後拿到哪一版,不确定性更高。
- 固定連結加索引頁:把轮換改成“全量都挂在索引頁上,只是顺序不同”,對發現更友好。
怎么判断目标 URL 到底有没有被發現
- 看服務器日誌里目标 URL 有没有出現過蜘蛛 UA 的請求,而不是只看入口頁有没有被訪問。
- 区分“已發現”和“已抓取”:日誌里没有請求,可能是没被發現,也可能是發現了但排期靠後。
- 把入口頁的多份抽样都儲存下来取並集,找出只出現在其中一份里的目标 URL,這些就是最容易漏掉的。
- 观察一段時間的請求增量趋势,而不是盯着某一天的记錄下结论。
轮換入口頁並不會让搜尋蜘蛛多抓,它只是改變了蜘蛛每次能看到的内容。轮換越碎,對重訪次數的依赖就越强。
實操上可以怎么調整
- 保證每份 HTML 都包含全部關键入口連結,随机只作用在次要連結上。
- 给重要目标 URL 多留几個發現入口:索引頁、相關推荐、站内可点击路径。
- 不要把連結全量唯一寄托在入口頁,配合站点地图和正常的内部連結结构更稳。
- 如果用 JS 輸出連結,尽量让初始 HTML 里也保留一份可抓取的連結列表。
- 定期比對不同抽样,把長期没有請求记錄的 URL 补進固定位置。
總结一下:入口頁連結轮換不是不能用,但要清楚它的代價是把“被發現”變成概率事件。轮換粒度越粗、關键連結越固定、可复現路径越多,目标 URL 被稳定發現的可能性就越高。