当站点用前端框架渲染主要内容时,搜索蜘蛛拿到的 HTML 往往和浏览器里看到的不完全一样。入口发现依赖链接,而链接如果只存在于渲染后的 DOM 中,抓取路径就会在某一层断掉。核对的重点不是“有没有用框架”,而是“蜘蛛在只有原始 HTML 的情况下能走到哪一步”。
一、先确认蜘蛛拿到的是哪一版 HTML
第一步不做优化,只做对比。用不携带 Cookie 的请求抓取一次原始响应,再用浏览器查看渲染后的 DOM,把两边的结果放在一起看。
- 原始响应中是否存在 title、主标题、正文首段;
- 原始响应中是否存在指向详情页或下级列表页的 a 标签;
- 渲染后多出来的链接,是导航、分页,还是“加载更多”按钮;
- canonical、hreflang、结构化数据出现在哪一版里。
如果这些元素只出现在渲染后,说明抓取路径依赖 JS 执行,属于需要重点排查的情况。
二、首屏可抓取内容的核对顺序
按“从入口到深层”的顺序检查,比逐个页面看更有效率。
- 首页与栏目页:原始 HTML 中是否有稳定的导航链接,能否沿着链接走到列表页。
- 列表页:每条记录是否对应一个真实的 a 标签,href 是否为可直接访问的 URL,而不是 onclick 或 data-id。
- 分页:翻页是否有独立 URL(如 ?page=2 或 /list/2),还是只有滚动加载。
- 详情页:正文是否在原始 HTML 中,若在渲染后才有,蜘蛛可能只看到一个空壳。
- 站点地图:Sitemap 是否覆盖了 JS 路由对应的真实 URL,且这些 URL 返回正常状态码。
三、前端路由常见的四种断点
- history 路由无服务端映射:/detail/123 这类路径在服务器上没有对应文件,直接访问返回 404,蜘蛛无法把它当作有效入口。
- 哈希路由:以 # 开头的片段不会发送到服务器,蜘蛛通常只按主路径抓取,后面的内容难以被发现。
- 点击加载更多:内容靠接口追加,没有新的 URL,也没有新的 a 标签,深层内容只能靠 Sitemap 补充。
- 懒加载与骨架屏:首屏渲染前是占位结构,抓取时刚好落在空档期,内容被判定为缺失。
四、服务端渲染与预渲染的取舍
如果列表页和详情页对发现很重要,优先保证它们有服务端可输出的 HTML 版本。可以是 SSR,也可以是构建时预渲染,或在请求头识别到抓取时返回渲染结果。需要留意两点:一是同一 URL 对不同来源返回的内容主体应保持一致,不要出现用户看到的和蜘蛛看到的差异过大;二是渲染后的页面仍需保留可点击的真实链接,而不是把链接藏进脚本里。
多语言与多地域站点
这类站点常按 IP 或语言做跳转,容易让蜘蛛拿到非目标语言的版本。建议用可直接访问的路径区分语言(如 /en/、/jp/),并用 hreflang 相互声明,而不是依赖跳转决定蜘蛛看到哪一版。
五、补强抓取路径的常规做法
- 主导航、面包屑、页脚保留纯 HTML 链接,确保任何一层都能顺着链接往下走;
- 分页保留真实 URL 与可点击的上一页、下一页;
- 把没有内链入口的深层 URL 写进 Sitemap,作为补充发现渠道;
- 列表页首屏至少输出一部分条目链接,不依赖滚动触发;
- 定期用抓取日志对比爬虫实际访问的 URL 与站点期望的 URL,找差值。
六、一次核对清单
- 关掉 JS,看页面还能否走通三层链接;
- 随机抽 10 个详情 URL,检查直接访问的状态码与内容;
- 检查分页是否有独立可访问 URL;
- 核对 Sitemap 中的 URL 与前端路由的实际路径是否一致;
- 对比抓取日志中入口页的响应大小,明显偏小的页面重点排查。
抓取路径的问题往往不是“蜘蛛不来”,而是来了之后走不过第二层。把每一层链接做成真实可访问的 URL,比事后补救更省力。