越来越多的站点用 JavaScript 拼装页面:商品列表、评论区、文章正文都可能在浏览器里才被填进 DOM。对用户来说这没问题,但对蜘蛛来说,它第一眼看到的东西可能和你打开页面时看到的完全不是一回事。这也是不少页面「内容明明很完整,却迟迟没有收录」的原因之一。
抓取和渲染是分开的两步
蜘蛛处理一个 URL,大致会经历两个阶段:
- 抓取原始响应:服务器返回的 HTML 源码,此时脚本通常还没执行,页面可能是空壳。
- 排队渲染:把页面放进渲染队列,执行 JavaScript,拿到渲染后的 DOM,再从中提取文字和链接。
渲染是有成本的环节,需要排队,也未必每个 URL 都会被渲染。这意味着只有在脚本跑完之后才出现的内容,被看到的概率和时机,都不如直接写在 HTML 里稳定。
这几种写法最容易让内容「看不见」
- 正文、价格、库存等关键信息全靠接口返回后再插入,初始 HTML 里只有一句「加载中」。
- 内链靠点击事件或脚本生成,a 标签没有真实的 href,蜘蛛拿不到下一跳地址。
- 内容藏在标签页、折叠面板、「查看更多」之后,需要交互才出现。
- 懒加载把首屏之外的内容全部留到滚动时再取,而渲染阶段可能已经结束。
- 无限滚动不产生新的 URL,翻十屏的内容在索引里只是同一页。
- 用 canvas、图片上的文字、CSS 伪元素承载正文,文字根本不在 DOM 里。
怎么确认蜘蛛到底看到了什么
- 用命令行工具取一次原始响应,或直接查看网页源代码,确认初始 HTML 里有没有你要收录的文字和链接。注意是「查看源代码」,不是浏览器里的「检查元素」。
- 在搜索引擎提供的 URL 检查工具里对比抓取结果与渲染截图,看两边内容是否一致。
- 临时关掉浏览器 JavaScript 打开页面,很多问题一眼就能看出来。
- 看服务器日志里该 URL 的响应体大小,如果长期只有几百字节,返回的多半是空壳。
让关键内容更容易被抓到
- 服务端渲染或静态生成:把一个页面的核心内容直接输出进 HTML。
- 预渲染:构建时把常用 URL 生成静态 HTML,适合更新不频繁的页面。
- 关键内容优先:标题、正文、主要内链放在初始 HTML,次要模块再交给脚本。
- 使用真实链接:a 标签带 href,指向可以被抓取的 URL,不要只写点击事件。
- 分页保留独立 URL:即使前端用无限滚动,也给一个可访问的翻页地址。
渲染是补充,不是替代
搜索引擎的渲染能力确实在提升,但渲染有排队、有超时、有失败率,也不是所有页面都会走到这一步。把所有内容都押在客户端渲染上,等于把「能不能被看见」交给了一个不完全可控的环节。更稳的做法,是让 HTML 本身就能说明这个页面是什么。
判断标准很简单:如果关掉 JavaScript,这个页面还剩多少能读懂的内容?剩下的那一部分,才是蜘蛛最稳的那一份。
收录问题,很多时候不是页面质量不够,而是内容根本没进入「可被评估」的状态。先确认蜘蛛看到的内容和你看到的一致,再谈其他优化,顺序会顺很多。