动态页面做死链检查时,不能只看HTTP状态码。状态码200只说明服务器接受了请求,不代表页面主体已经渲染出有效内容;状态码404也不一定说明用户看不到东西,有些站点会用404状态返回一个“内容不存在”的提示页。要确认可见内容,核心方法是把“服务器返回的原始HTML”和“浏览器渲染后的DOM”分开检查,再判断链接目标是否真的可用。
动态页面的内容通常由JavaScript在浏览器端填充,因此同一URL可能出现三种结果:
死链检查要解决的是“这个链接指向的目标是否还有效”,所以不能停在源码层。对动态页面,至少要把渲染后的DOM作为主要证据。
打开目标页面,按F12进入开发者工具,按以下顺序操作:
document.querySelectorAll('a'),检查返回的锚点数量和href值。display:none、visibility:hidden或尺寸为0。判断结果时注意:如果链接在DOM中存在,但被隐藏,它不算用户可见内容;如果链接可见但点击后进入404,它才是需要处理的死链。如果链接在源码中不存在、渲染后才出现,那么用普通爬虫抓源码做死链检查会漏报或误报。
确认可见内容时,常见做法有两类:
选择依据是页面动态程度和检查目的。如果只是定期扫描全站、找出明显404,请求式可以先跑一轮;如果要确认某个动态列表、筛选页或单页应用里的链接是否可见可用,就必须用渲染式复核。两者结果不一致时,以渲染后用户能看到的DOM为准,再回查请求日志定位原因。
对每个可疑动态页面,逐项核对:
javascript:void(0)或指向当前页。判断规则可以简化为:状态码正常且渲染后可见、点击后到达有效内容,才算通过;状态码正常但渲染后无对应内容,记为“疑似失效”,需要继续查接口和脚本;状态码为404或410,且渲染后也没有有效替代内容,记为死链。
假设某个商品筛选页的“下一页”链接在源码中不存在,渲染后DOM里也找不到,但接口返回了空列表。此时不能直接判定链接死链,而应先确认是筛选条件确实无结果,还是接口异常导致分页未生成。修复时优先处理数据或脚本问题;如果该链接已无对应内容,应返回410或做301到相关分类页,而不是保留一个点击后空白的按钮。
复检时用同一套渲染条件再跑一次:相同视口、相同等待时间、相同登录状态。只有条件一致,前后结果才可比较。对动态页面,建议把“渲染后DOM中是否存在有效href”作为固定检查项,而不是只看HTTP状态码。
下一步:挑一个你怀疑有问题的动态页面,按上面的清单记录状态码、渲染后DOM和点击结果,先形成一条可复核的证据链,再决定是修脚本、改数据还是调整链接指向。