有些蜘蛛池或内页分发系统为了把链接“均匀”分给爬虫,会让入口页每次请求都返回一组不同的链接:服务端随机抽取、按时间片轮换,或者判断 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 被稳定发现的可能性就越高。