不少蜘蛛池入口页为了省事,把目标 URL 交给一段 JavaScript,等页面加载后再用 document.createElement 或 innerHTML 把链接插进 DOM。浏览器里看着正常,但搜索蜘蛛能不能发现这些链接,并没有一个统一答案。
搜索蜘蛛处理 JavaScript 的基本流程
多数搜索引擎的抓取可以拆成两步:先按 URL 取回原始 HTML,再决定是否把页面放进渲染队列,用无头浏览器执行脚本,最后从渲染后的 DOM 里提取链接和内容。
- 第一步只看原始 HTML,此时 DOM 里还没有 JS 插入的链接。
- 第二步的渲染队列有容量和优先级限制,不是每个页面都会被渲染,也不是抓完马上渲染。
- 只有渲染完成,JS 生成的 a href 才会进入待抓取队列,之后还要再排一次抓取。
换句话说,链路更长,不确定性更多。链接最终被发现,可能比静态输出晚很多,也可能在某些引擎上根本走不到那一步。
几种常见写法的差别
原始 HTML 里已经有 a 标签
这是最稳的情况。即使页面上还有 JS,蜘蛛在第一步就能拿到链接,渲染与否都不影响发现。
整段链接由 JS 拼接插入
能否发现,取决于该引擎是否执行脚本、渲染队列是否轮到你的页面。同一个入口页,在不同搜索引擎上的结果可能完全不同。批量入口页更容易被排在渲染队列后面。
用 onclick 或 location.href 跳转
这类写法在渲染后的 DOM 里并不存在可提取的 a href,蜘蛛通常无法把它当作链接来发现目标 URL,而只会视为页面上的一个交互行为。
把链接放进 noscript
部分抓取器不解析 noscript 内容,把它当作唯一输出方式并不安全。
想让目标 URL 更容易被发现的几种做法
- 入口页尽量输出静态 HTML,关键链接直接写在原始源码里,用标准的 a 标签加 href。
- 如果页面必须用前端框架,考虑服务端渲染或预渲染,让首屏链接出现在返回的 HTML 中。
- 动态渲染要谨慎设置 User-Agent 判断,别把普通访客也挡在门外,也别漏掉不常见的蜘蛛标识。
- sitemap、主动推送可以作为补充通道,但它们不能替代页面上的链接发现。
- 同一批目标 URL 不要只藏在 JS 里,至少在入口页保留一份静态链接版本。
怎么验证蜘蛛到底有没有拿到链接
- 查看页面源代码,搜索目标域名,确认链接不在 JS 字符串里,而是真实的 href。
- 用支持 JS 渲染的抓取工具跑一遍,看渲染后的 DOM 里链接是否存在、是否可访问。
- 对照服务器日志,看搜索蜘蛛是否请求过页面,以及是否请求过目标 URL。
- 检查链接是否被 nofollow、X-Robots-Tag 或 robots.txt 影响。
- 自有站点可以用站长平台的 URL 检查工具,看渲染结果和页面里被发现的链接。
对蜘蛛池入口页的实际建议
入口页的核心作用是让搜索蜘蛛拿到目标 URL,越简单、越接近静态 HTML,越不容易在渲染环节掉链子。把链接藏在 JS 里,等于给发现过程多加了一道不确定的关卡。如果确实需要 JS,至少保证原始 HTML 里有一份等价的链接,再考虑用其他提交方式配合。
是否被抓取、抓取后是否收录,最终由搜索引擎自行判断。本文只讨论技术实现上的差异,不承诺任何收录或排名结果。