把目标链接用 JavaScript 动态写进页面,是很多入口页的常见做法:模板里只放一段脚本和一个数据源,链接在浏览器执行后才出现。问题是,搜索蜘蛛看到的往往不是你浏览器里看到的那份 DOM。是否被发现,取决于搜索引擎的渲染能力、你的脚本写法,以及链接出现的时机。
搜索蜘蛛看到的是源码还是渲染后的页面
主流搜索引擎的抓取大致分两步:先抓原始 HTML,再在满足条件时排队做 JS 渲染。渲染不是每次抓取都会发生,它更慢、成本更高,通常只在原始 HTML 内容不足、或页面被认为值得渲染时才触发。
这意味着:
- 链接写在 HTML 源码里,被发现的机会相对稳定;
- 链接靠 JS 生成,等于把发现机会押在对方的渲染队列上,延迟可能从几小时变成几天,甚至压根不渲染;
- 如果原始 HTML 只是一个空白容器,渲染又失败,那这个入口页对搜索蜘蛛来说基本等于没有链接。
哪些 JS 写法相对容易被处理
同样是 JS 生成链接,写法差别很大:
- 服务端渲染或静态生成:脚本只是辅助,链接实际已经在返回的 HTML 里,这是最稳的做法;
- 首屏同步写入 DOM:脚本在页面加载早期就把链接节点插入文档,渲染时通常能抓到;
- 依赖用户交互:点击“加载更多”、滚动到底部才出现链接。搜索蜘蛛一般不会滚动或点击,这类链接基本不会被发现;
- 二次异步请求后拼装:等接口返回再插入链接,渲染超时或接口慢,都可能让链接错过这次渲染。
容易被误判的几种情况
还有个更隐蔽的问题:日志里有搜索蜘蛛访问,不代表链接被发现了。它可能只是抓了外壳 HTML,没有执行脚本,也没有再回来渲染。
判断依据不是“有没有来”,而是“渲染后的页面里有没有出现目标链接,以及目标 URL 后面有没有被抓取记录”。
另外,渲染通常是分批、限量的。如果你的入口页数量很多、结构又高度相似,渲染资源会被摊薄,链接出现的速度会更慢,甚至只有其中一部分被处理。
怎么自己验证
- 用搜索引擎官方的 URL 检查、实时测试类工具,看渲染后的 HTML 里是否包含目标链接;
- 用命令行工具或关闭 JS 的浏览器访问入口页,对比源码与渲染结果的差异;
- 看服务器日志:目标链接对应的抓取请求有没有出现,间隔是否合理;
- 对比同一批链接中“写在 HTML 里”和“JS 生成”两组的抓取覆盖率,差异会说明问题。
实际建议
如果入口页的目的是让搜索蜘蛛发现 URL,核心思路是不要给抓取增加额外门槛:
- 关键链接尽量直接输出在 HTML 源码里,不要只存在于脚本变量中;
- JS 只用来做分页、折叠这类锦上添花的功能,不要用来承载唯一入口;
- 如果必须用 JS,至少保证首屏渲染就能拿到链接,并留一个 HTML 版兜底;
- 不要指望渲染能弥补结构问题,它解决的是“能不能读”,不是“一定读、马上读”。
最后要提醒的是,无论入口页怎么写,它做的只是把 URL 摆到搜索蜘蛛面前,发现和收录是两件事。目标页面本身的质量、可访问性、是否有独立价值,才是决定它会不会被收录的主要因素。入口页能做的,是别让目标 URL 在第一步就掉队。