不少人做入口页时习惯先给一个静态骨架,再用 JavaScript 把目标链接插进 DOM。页面在浏览器里看起来链接齐全,但搜索蜘蛛看到的可能是另一回事。结论先给:能不能被发现,取决于链接最终有没有出现在蜘蛛抓取并渲染后拿到的内容里,而不是取决于你在浏览器里能不能点到。
蜘蛛拿到页面后大致会做两件事
一件是直接读服务端返回的 HTML 源码,另一件是按自身能力去执行页面里的 JavaScript,再把渲染后的结果拿来解析。不同搜索引擎、不同抓取场景(尤其是资源配额紧张的时候)对第二件事的投入差别很大。所以 JS 插入的链接属于“可能被发现,但不确定性明显更高”的一类。
哪些写法相对容易被发现
- 链接直接写在服务端返回的 HTML 里,无论是静态输出还是服务端渲染,这是最稳的一类。
- JS 只做增强:链接本身已经在 HTML 中存在,脚本只负责排序、折叠、懒加载。蜘蛛读到源码就已经拿到目标地址了。
- 页面加载后立即同步插入、不依赖任何用户交互,并且渲染抓取确实被执行到,也有机会被发现。
哪些写法基本指望不上
- 必须点击按钮、滚动到某个位置、悬停之后才触发的插入,绝大多数抓取不会模拟这些交互。
- 依赖登录态、Cookie 或本地缓存才有数据的接口。
- 用定时器拖很久,或者等一串接口串行返回后才写入链接。
- 地址由脚本在运行时拼接,且拼接逻辑依赖随机数或时间戳,即使执行了也可能每次都不一样。
判断方法:别用浏览器看,用源码看
最常见的误判,就是打开开发者工具看到 Elements 面板里链接整整齐齐,就认定蜘蛛也能看到。那个面板显示的是渲染后的 DOM,不等于服务端返回的源码。
- 用“查看网页源代码”(不是“审查元素”)确认目标链接是否出现在初始 HTML 中。
- 用命令行抓一次入口页源码,或配合禁用 JS 的抓取方式,看返回内容里有没有目标地址。
- 对照入口页访问日志,确认蜘蛛请求入口页之后,有没有紧接着请求目标 URL,而不是只抓了入口页就离开。
- 如果页面大量依赖 JS,可以看站长平台提供的渲染后快照或抓取诊断信息,判断渲染是否真的被执行。
更实用的做法
如果你在运营蜘蛛池,入口页的首要任务是让目标 URL 出现在容易被读到的位置,那就没必要把发现链路的可靠性押在脚本执行上。
- 目标链接尽量以普通 a 标签写在服务端输出的 HTML 中,脚本只做锦上添花。
- 确实需要动态生成时,至少留一份静态兜底列表,和动态内容放在同一个页面里。
- 控制单个入口页的脚本复杂度,减少串行请求和长延时。
- 不要把隐藏链接、交互后才出现的内容当作唯一的暴露渠道。
几个容易混淆的点
JS 插入的链接和 JS 跳转不是一回事。前者是页面里存在一个可解析的链接,后者是页面打开后直接跳走,蜘蛛是否跟进要看具体实现。用 noscript 内容兜底也有用,但它只在脚本不执行时才生效,不能替代正常输出。还有一种情况是链接确实在源码里,但被包裹在一大段脚本字符串中,虽然文本搜得到,能否被当作链接解析仍要单独验证。
记住一个判断标准:把页面源码(不是渲染后的 DOM)保存下来,用文本搜索目标 URL,搜得到才叫“稳”,搜不到就只能算“有机会”。