入口页面能访问、能返回内容,并不代表从它出发的深层链路成立。要定位断点,先把“链路”拆成可逐段验证的跳转序列,再对每一跳分别检查目标是否存在、返回状态是否可跟随、以及该目标是否还能继续指向下一层。断点通常不在入口,而在某一跳的响应或链接生成条件上。
拿你手里的一个入口页作为对象,从它开始向下走,记录每一跳的来源URL、链接文本、目标URL、目标返回状态。不要一次抓全站,只走你怀疑失效的那条路径,直到出现以下任一情况:目标返回非正常状态、目标页面存在但不再包含下一层链接、或者链接在原始HTML里根本不存在。把这条路径写成有序列表,断点就落在第一个不满足“可继续向下”的位置。
这一步的价值在于把模糊的“深层进不去”变成具体跳数。假设入口为 A,中间为 B,深层为 C:如果 A→B 正常而 B→C 缺失,问题在 B 的链接生成;如果 B→C 的链接存在但 C 返回异常,问题在 C 自身。两种原因的修复动作完全不同,先分清能避免改错地方。
实际排查中反复出现的原因可以归为三类,每类的证据不同:
<a href>。常见于链接由脚本、筛选条件或权限状态动态插入,而当前抓取环境没有触发该条件。还有一种容易被误判的情况:B 的链接存在且 C 正常,但 B 本身只能通过入口页的某个交互才出现,直接请求 B 得不到同样结果。这属于入口到 B 之间的隐藏条件,需要回到上一跳检查。
选定断点后,做一个最小对照:分别请求 B 的URL和 C 的URL,对比返回状态与响应体中的链接。如果 B 能返回但正文里没有 C 的链接,而你在浏览器里能看到该链接,说明链接依赖客户端渲染或特定状态;下一步应检查渲染后的DOM,而不是继续改服务端模板。如果 B 的响应里本来就有 C 的链接,而 C 返回异常,下一步转向 C 的可访问性与内容状态。
这个动作的结果直接决定后续方向:确认是“链接生成条件”问题,就去核对触发条件(登录态、筛选参数、分页参数);确认是“目标状态”问题,就去处理 C 的返回码或替代目标。不要在未确认归属前同时改两端。
假设入口页 A 正常,A 指向列表页 B,B 在带 ?page=1 时能列出条目并链接到详情页 C,但抓取时请求的是不带参数的 B,返回的列表为空,于是 B→C 的链接不存在。此时断点表现为“深层链路失效”,实际原因在 B 的链接生成依赖分页参数。
处理方式是先确认 B 在默认参数下是否本就无内容,再决定是给 B 增加稳定入口,还是让 A 直接指向带参数的 B。改完后重新走一遍 A→B→C,确认每一跳都能继续向下。这个例子的数字仅用于说明比较方法,不代表任何真实站点的表现。
排查时几个现象容易被当成结论,需要留出其他解释:
把这些解释排除后,剩下的才是真正的断点。定位到具体一跳后,修复动作应只针对该跳,并重新走一遍完整路径确认链路恢复;若断点仍在,回到清单重新记录下一跳,不要跳过验证直接扩大改动范围。