动态页面做死链检测时,不能只看HTTP状态码。状态码200只说明服务器接受了请求,不代表页面渲染后用户能看到有效内容。要确认“可见内容”,需要把原始HTML、渲染后DOM和实际可见文本三层结果放在一起比对,再判断链接是否真的可用。
动态页面的内容通常由JavaScript在浏览器端生成。检测工具若只抓取原始HTML,可能拿到一个空壳:<div id="app"></div>,而真实文字、链接和商品信息都在脚本执行后才出现。因此“可见内容”至少包含三类证据:
display:none、visibility:hidden和零尺寸元素后,用户实际能读到的文字。href,是否被遮挡或禁用。如果只依据原始HTML判断,动态页面里由前端路由生成的链接很容易被误判为死链;反过来,原始HTML里存在但渲染后被移除的链接,又会被误判为正常。
可执行的步骤是:对目标URL发起一次带JavaScript渲染的抓取,等待网络空闲或指定选择器出现,再导出渲染后的HTML。以命令行工具为例,假设使用支持渲染的抓取方式,核心检查项如下:
<a>标签。href,过滤掉javascript:、#和空值。这里的关键是第4步不能只记录状态码。有些站点对不存在的页面返回200并展示“未找到”文案,这种情况需要结合响应正文中的特征词判断。反之,返回404也可能只是权限控制,需要人工复核。
一个链接在检测中失败,可能有多种解释,不能直接断言页面已删除。常见情况包括:
判断方法是做对照实验:同一URL在浏览器中手动打开,观察Network面板中接口状态;再用同一抓取配置重跑一次,看结果是否稳定。如果两次结果不一致,优先怀疑渲染时序或接口波动,而不是直接判定死链。
一份可用于定位问题的死链检测结果,至少应包含:检测时间、原始URL、渲染后发现的链接、每个链接的状态码、最终URL、响应长度,以及判定为疑似死链的依据。缺少渲染证据的报告,无法区分“页面没这个链接”和“脚本没跑完”。
下一步可以固定一个页面样本,分别用原始HTML抓取和渲染式抓取各跑一次,对比两次得到的链接数量与状态码差异。差异最大的那部分,就是动态内容检测中最需要人工复核的区域。