不少站点换成前端框架渲染之后,运营同学会发现一个现象:页面在浏览器里看起来正常,导航、列表、详情链接都能点,但搜索蜘蛛似乎只抓到很少的URL。问题往往不在内容质量,而在于链接是否出现在抓取工具拿到的那份HTML里。这一篇从JavaScript渲染与首屏链接的角度,聊聊URL发现在实际运营中的常见坑与处理办法。
一、蜘蛛先拿到的是“第一份HTML”
当抓取工具请求一个URL时,首先得到的是服务器直接返回的HTML。如果链接是由JS在浏览器执行后才插入DOM的,那么这份原始HTML里可能一个可抓取的a标签都没有。搜索引擎具备一定的渲染能力,但渲染需要额外排队、消耗资源,并且不一定对所有URL都触发。把关键的导航与列表链接放在首屏HTML中,仍然是最稳的做法。
二、几种容易漏掉链接的写法
- 单页路由只靠 history.pushState:页面切换没有整页请求,链接由JS生成。若列表页首屏不输出a标签,次级URL就很难被发现。
- 用 div 或 span 加 click 事件代替 a 标签:视觉上是链接,语义上不是,抓取工具无法顺着它走。
- 滚动到可视区才插入链接:无限加载、懒加载列表,第一屏之外的条目往往依赖滚动事件。
- 选项卡、折叠面板里的内容延迟渲染:默认隐藏的栏目内容,可能只在点击后才去请求数据。
- JS拼接URL时参数或路径出错:相对路径基准不对、中文未编码、多余的#号,都会让链接指向无效地址。
三、自查方法
- 用 curl 或浏览器的“查看网页源代码”看原始HTML,确认导航、分类、分页链接是否在其中。
- 在浏览器中禁用JavaScript,重新打开页面,观察还能不能走通主要路径。
- 把服务器日志里实际被请求的URL与站内链接清单做比对,找出只存在于JS里的那部分。
- 抽查渲染后的DOM与原始HTML的差异,差异过大的页面要重新评估渲染方案。
四、可落地的折中做法
没有必要为了抓取把整站改成服务端渲染,但可以把“链接出口”这部分单独做静态化:
- 主导航、面包屑、栏目列表、分页组件由服务端输出,其余交互用JS增强。
- 列表页至少输出第一页与翻页入口,深分页可用带普通参数的链接。
- 对确实依赖JS的站点,考虑服务端渲染或预渲染,让首屏HTML包含核心链接。
- 用Sitemap补充那些不方便放进HTML的URL,但它只是补充,不能替代站内链接。
五、几个容易被忽略的边界
一是渲染后的内容与原始HTML差别不要太大,否则容易被判为向抓取工具和用户展示不同内容。二是渲染会消耗资源,页面响应耗时上升反而会影响抓取效率,需要权衡。三是移动端与桌面端如果使用不同的渲染策略,链接结构要保持一致。四是上线新模板后,最好固定一个抽查时间点,用日志复核URL发现是否变差。
把链接放在HTML里,比让蜘蛛去执行一段脚本要可靠得多。技术选型可以灵活,但核心入口要保持简单。