不少蜘蛛池入口页为了省事,用 JavaScript 在前端拼出链接列表:先把页面框架加载完,再靠一段脚本把目标 URL 插进 DOM。写页面的人看得见链接,但搜索蜘蛛看到的是不是同一份内容,就成了一个常见疑问。
搜索蜘蛛对 JavaScript 的处理方式
主流搜索引擎的抓取大致分两步:先抓取服务器返回的原始 HTML,把里面的链接、正文入库;如果页面必须执行脚本才有内容,再排进渲染队列,用无头浏览器跑一遍,二次提取链接和文本。
关键点在于这两步不是同时发生的。原始 HTML 里没有的链接,只能等渲染那一步才可能被发现,而渲染队列有排队、有额度,也存在放弃的情况。
- 原始 HTML 中直接出现 a 标签的 href,发现路径最短,也最稳定。
- JS 动态插入的链接依赖渲染,通常会有延迟,快则几分钟到几小时,慢则数天。
- 渲染本身消耗资源,入口页数量大、内容单薄时,部分页面可能长期排不上队。
- 脚本报错、接口超时、需要交互或登录才出现的链接,渲染也拿不到。
先确认你的入口页是不是「JS 依赖」
不要凭感觉判断,用下面几种方式验证:
- 禁用浏览器 JavaScript,打开入口页,看目标链接是否还在。
- 用 curl 或抓包工具请求入口页,直接看响应体里有没有 href。
- 对比「查看源代码」和「审查元素」面板,两者差异越大,JS 依赖越重。
- 查看服务器日志,看目标 URL 有没有来自搜索蜘蛛的请求记录。
如果源代码里一条链接都没有,而审查元素里有一堆,那基本可以判断:URL 发现这件事被押后到了渲染环节。
让链接更早被看到的一些做法
- 服务端直出:在 HTML 里就把链接渲染好,前端脚本只做增强,不做唯一数据源。
- 首屏优先:把关键入口链接放在 HTML 靠前的位置,别等整页脚本执行完才插入。
- 兜底链接:在 noscript 中放一份同样的链接,但它只是补充,不能当作唯一方案。
- 控制入口页体量:一个入口页塞几千条链接,容易让真正重要的链接被稀释。
- 配合 sitemap:把希望被发现的 URL 单独整理提交,减少对渲染的依赖。
这些调整只是提高 URL 被发现的概率和速度,并不能保证被收录,也不能保证排名。发现、抓取、索引是三件不同的事。
几个容易踩的误区
- 以为「浏览器里能看到」等于「蜘蛛能看到」,两者的执行环境并不相同。
- 以为 noscript 里的链接一定会被采信,实际不同引擎的处理策略有差别。
- 用 JS 动态生成 sitemap 地址,结果提交的内容本身也要渲染才能拿到。
- 只看蜘蛛有没有来,不区分原始抓取和渲染抓取,把两种 UA 混为一谈。
怎么验证链接是否真的被发现
最直接的证据还是日志。观察目标 URL 的请求记录,看访问时间、UA、请求频率,判断是原始抓取带来的还是渲染抓取带来的。站内可以用抓取诊断类工具查看某条 URL 的 HTML 快照,对比快照里是否包含你的链接。如果链接长期只在渲染后才出现,说明入口页结构确实需要调整。
结论:JS 动态插入的链接并不是完全没机会被发现,但它把「发现」推给了一条更慢、更不确定的通道。入口页作为 URL 发现的载体,链接越早出现在原始 HTML 里,越省事。