很多站点遇到的不是“蜘蛛不来”,而是蜘蛛来了却停在半路。首页、列表第一页、几个热门详情页的抓取记录都很正常,再往下的页面几乎查不到访问。这种情况往往不是抓取配额不够,而是从入口到目标 URL 之间有那么一跳断了——蜘蛛没法沿着链接把这段路走完。
先把蜘蛛走过的路径复原出来
日志只能告诉你蜘蛛访问了哪些 URL,不能直接告诉你它是从哪个链接点进来的。所以复原路径要靠两份材料互相对照:一份是抓取日志,一份是站内链接关系。
做法不复杂。挑三到五个长期没有抓取记录的页面,逐个反问几个问题。
- 站内有哪些页面链接到它?
- 这些页面自己有过抓取记录吗?
- 如果有,是在什么时间被抓的,之后有没有再被访问过?
如果入链页面本身就没被抓过,那目标页面属于完全没有路可走。把 URL 写进 Sitemap 只能算一次提名,蜘蛛要不要去走、能不能走通,是另一回事。如果入链页面被抓过,目标页却始终没有记录,问题多半出在链接本身,或者路径中间那一跳的响应上。
最常见的三种“断跳”形态
- 链接藏在需要交互才出现的位置。筛选、排序、翻页中的“加载更多”这类按钮,如果靠脚本触发,链接在初始 HTML 里可能根本不存在,蜘蛛看到的是一个空容器,后面那一层自然就接不上。
- 中间层页面对蜘蛛不可用。分类页、标签页长期返回 5xx,或者响应时间明显偏长,蜘蛛走到这一层就不再往下,深层页面连带失去入口。
- 链接存在,但指向了经过多次跳转的地址。一两次跳转通常没问题,链路一深,蜘蛛往往选择放弃继续跟进,这条路径等于断在中间。
补路径比催抓取更管用
发现深层页面没有抓取记录,很多人的第一反应是调整抓取频次、重新提交 Sitemap、想办法加外链。这些动作不是没意义,但如果路径本身是断的,增加访问量只会让蜘蛛在同一个位置反复折返。
更值得先做的是把路补上:
- 在相关度高的正文内容里插入内链,而不是只在页脚堆一排链接;
- 面包屑和上一级导航指向真实可抓的父级页面,而不是跳回首页;
- 关键入口尽量用原生链接写在初始 HTML 中,减少对脚本拼接的依赖;
- 同一批 URL 的链接形式保持一致,避免同一页面被多条不同路径指向。
蜘蛛能抓多少,取决于它能走到多远。走不到的地方,抓取配额再宽也没有意义。
服务器稳定性本身就是路径的一部分
路径上的每一跳都要靠一次 HTTP 请求完成。任何一跳慢下来,整条链路都会受影响,而这种影响在日志里往往只表现为“后面没有了”。
可以按层级看响应时间:入口层、中间层、详情层分别统计。如果中间层某个模板长期偏慢,先优化它的收益通常比调整抓取设置更直接。缓存命中率、动态查询、并发限制,最后都会落在这一层。
状态码的稳定性也要留意。同一批 URL 今天返回 200、明天返回 503,蜘蛛对这条路径的信任度会下降,重新试探的间隔也会被拉长,恢复起来比第一次抓取慢得多。
可以固定下来的自查流程
- 列出目标 URL 清单,按所在层级分组;
- 对每个 URL 回溯入链,标出直接链接它的页面;
- 查这些入链页面近期的抓取记录;
- 确认链接在初始 HTML 中可见,不依赖脚本执行后才出现;
- 检查路径每一跳的状态码与响应时间;
- 补齐缺失的入口链接,观察两到四周后再对比日志变化。
抓取恢复通常不是一次动作就能完成的。路径修好之后,蜘蛛还要按自己的节奏重新走一遍,中间可能隔上几天甚至更久。与其反复提交,不如把这套检查固定成周期动作,定期确认从入口到目标 URL 的每一跳都还在。