多层入口页的结构在很多蜘蛛池里很常见:第一层放几个聚合页,第二层再挂具体的目标 URL。跑一段时间后,服务器日志里常常是另一种画面——第一层的请求记录断断续续有,第二层几乎空白。这种情况不一定是蜘蛛「不爬」,多数时候是链接可达性和层级设计出了问题。
先确认蜘蛛到底有没有到第二层
不要只看总抓取量。把日志按爬虫 UA 过滤,再用路径前缀把第一层和第二层分开统计,看第二层的 URL 有没有产生过任何请求。这里要区分两种情况:一种是收到了请求但返回 3xx、4xx、5xx,另一种是压根没有请求记录。前者属于抓取失败,后者才属于「没被发现」。
如果日志里确实一条第二层的记录都没有,还要排除缓存层的干扰。有些站点前面挂了 CDN 或反向代理,爬虫的请求被缓存命中,日志里只留下回源的那一条。可以临时在第二层 URL 上加一个不参与缓存的查询参数做测试。
只停在一层,常见的原因
- 链接没写进 HTML。 第一层的链接如果是用 JS 动态插入,或者绑在点击事件上,而 HTML 源码里没有真正的 href,抓取阶段就可能看不到。
- 链接藏在交互后面。 需要点击「展开更多」、滚动到底部才加载的分页、切换标签页才出现的列表,都属于这一类。
- 第一层的链接数量太多。 一个页面挂了几百上千条链接,蜘蛛每次可能只取前一部分就离开,排在后面的第二层入口长期轮不到。
- 同页链接指向太多不同域名。 跨域链接本身没问题,但如果其中有些域名被 robots.txt 拦住、或者解析异常,整体抓取效率会被拖下来。
- 第二层 URL 的参数形态太差。 一大串会话参数、排序参数,容易被判定为重复内容或低优先级,进入队列后迟迟不被取。
分层设计上可以做的调整
控制单页链接数量
把第一层拆成多个页面,每页控制在几十条以内,比在一页上堆满更利于抓取。第二层同理,不要把同一批目标 URL 在两个层级里重复挂。
让第二层入口更靠前
把需要被发现的第二层链接放在正文区域靠上的位置,而不是页脚、侧栏或大段文字之后。页面的 HTML 体积也尽量压一压,模板里用不到的样式和脚本能删就删。
用 sitemap 做补位
分层入口页适合做发现路径,sitemap 更适合做覆盖面的兜底。两层 URL 都写进 sitemap,并在 robots.txt 里声明地址,比单纯依赖页内链接稳一些。注意 sitemap 里只放 200 状态、可正常访问的地址。
检查中间环节
第一层到第二层之间如果还有跳转,尽量用 301 直达,避免多次 302 串联。跳转链太长时,抓取预算消耗在中间页上,第二层就更难轮到。
边调整边观察
改完之后不要急着下结论。抓取频率的变化通常有滞后,按周对比日志里第二层的请求量、响应状态分布和首次出现时间,比看单日数据有意义。如果两周后第二层依旧没有请求记录,再回头逐一核对上面几条原因,而不是继续加链接数量。
入口页分层的作用是给搜索蜘蛛提供一条清晰、可达的路径,它不保证目标 URL 一定被抓取或被收录。发现、抓取、索引是三件事,任何一层出问题都会让最终结果停在某个环节。
实际操作中,宁可把层级做浅一点、每层链接少一点,也不要为了覆盖面把结构做得又深又乱。结构越简单,出现「只抓到第一层」这种情况的概率越低,排查起来也越快。