蜘蛛进入一个站点,通常不是随机游走。它从一个入口页开始,沿着页面里的链接一层层往下,能走到哪里、走多深,取决于站点的入口层级怎么安排。入口层级混乱时,常见的结果是:首页和少数几个页面被反复抓取,大量详情页长期没有抓取记录。
入口层级的三个角色
把站内页面粗略分成三层:首页、栏目页(列表页、聚合页)、详情页。这三层在抓取路径里承担的任务并不一样,混着做容易出现“该被发现的没被发现”。
首页:负责分发,不负责堆放
首页被访问频率最高,它的主要作用是把蜘蛛送到下一层。如果首页堆了几百条链接,其中大半是促销、活动、无关推荐,蜘蛛的注意力会被分散,真正需要被抓取的栏目入口反而被挤到后面。保留稳定的主导航、少量重要的栏目入口即可。
栏目页:蜘蛛的中转站
栏目页是详情页 URL 的主要来源。它需要满足两个条件:一是能从首页通过静态链接点到;二是列表本身可被抓取,不依赖滚动、点击“加载更多”才出现。分页链接也属于这一层,第一页之后的分页如果只能用 JavaScript 触发,深层内容基本就断在这里。
详情页:终点,也是新的起点
详情页是抓取目标,同时也是通往其他详情页的节点。相关推荐、上一篇/下一篇、同标签聚合,都能让蜘蛛在详情层内部横向移动。这类链接要控制数量,一页放十几条相关链接通常足够,塞进几十条效果反而下降,因为重要链接被稀释。
内链要“能走通”,而不是“看起来很多”
- 每个栏目页至少有一条从首页可点击到达的静态路径,不要只靠站内搜索框。
- 列表分页保留可抓取的链接,第一页、第二页、末页都要能点到。
- 避免孤岛页:新上线的详情页如果没有进入任何列表和相关推荐,只能等 Sitemap 提醒。
- 全站导航的链接数量保持克制,几百条链接的导航对蜘蛛和用户都不友好。
- 链接文字尽量描述目标页面内容,不要清一色“点击这里”。
Sitemap 和内链是两条腿,别互相打架
内链决定蜘蛛日常沿着哪些路径走,Sitemap 更像一份补充清单,用来提示那些路径较深、更新频繁或新产生的 URL。两者给出的地址应当一致:如果内链指向带参数的版本,Sitemap 写的是静态化版本,蜘蛛面对的是同一内容的两个地址,抓取会被分散。发现这种不一致时,先统一地址,再考虑用 canonical 收敛。
服务器不稳定,再顺的路径也走不通
抓取路径的设计再好,前提是蜘蛛每次请求都能拿到正常响应。持续的高响应时间会让蜘蛛在单位时间内走得更少,超时和连接中断则直接中断这条路径。5xx 出现频繁时,蜘蛛通常会降低抓取频率,恢复需要时间;429 表示请求过多,应当按照对方给出的 Retry-After 调整节奏,而不是继续加压。
判断问题出在路径还是服务器,可以分两步:先看服务器日志里响应码和响应时间的分布,再看被请求的 URL 是否集中在列表页和分页。两者交叉看,方向通常就清楚了。
一个可执行的检查顺序
- 从首页出发,手动点出一条到最深层详情页的路径,记录需要点击几次。
- 检查栏目页分页是否可抓取,末页是否可达。
- 核对 Sitemap 中的 URL 与内链实际指向是否一致。
- 看服务器日志的响应码与响应时间,确认没有被超时和 5xx 大面积打断。
- 找出最近更新但长期没有抓取记录的页面,看它们是否缺少入口。
抓取这件事很少靠单点技巧解决。入口给对、路径通畅、响应稳定,这三件事做好了,蜘蛛能覆盖的范围自然会往合理的方向走。