蜘蛛抓取一个页面,通常不是“下载完 HTML 就结束”。对很多站点来说,真正的 URL 发现发生在两个阶段:先是服务器返回的原始 HTML,然后是渲染后的 DOM。两阶段里链接的可见性不一样,抓取路径也会不同。
第一阶段:原始 HTML 里的链接
蜘蛛请求一个 URL,拿到响应体。如果响应是 HTML,它会先解析原始代码,把 a 标签的 href、link 标签等提取出来。这些链接会进入待抓取队列。这个阶段不依赖 JS 执行,速度最快,也最稳定。
所以,导航、面包屑、文章列表、分页这些关键路径,最好能在原始 HTML 里找到。你可以在浏览器里禁用 JS 查看源代码,或者在命令行用 curl 拿一份 HTML,看看链接是否还在。
第二阶段:渲染后的链接
有些站点用 JS 在客户端生成列表、加载更多、推荐模块。蜘蛛可能会把这类页面放入渲染队列,等资源执行完再提取链接。但渲染不是免费的:它要占用额外资源,也可能因为超时、资源加载失败而放弃。即使渲染成功,链接的发现时间也会比原始 HTML 晚。
更麻烦的是,如果链接只存在于点击事件或滚动加载里,蜘蛛不一定会触发。它不会像人一样无限滚动,也不一定点击每个按钮。因此,“用户能看到”不等于“蜘蛛能发现”。
把关键链接放回原始 HTML
- 主导航和分类入口用 a 标签,href 指向真实 URL,不用 onclick 跳转。
- 列表页第一页的条目尽量服务端输出,分页链接用可抓取的 a 标签。
- “加载更多”如果只是按钮,可以配一个指向下一页的普通链接作为兜底。
- Sitemap 可以补充那些藏在 JS 里的 URL,但它不能替代内链的权重传递。
渲染队列与抓取预算
渲染一个页面往往要再请求 JS、CSS、图片等资源。对服务器来说,这是一次抓取变成多次请求;对蜘蛛来说,渲染队列的容量有限。如果大量页面都依赖渲染,蜘蛛可能只渲染一部分,剩下的页面链接就发现不了。
抓取预算不是只算 HTML 请求,渲染带来的资源请求也会占份额。页面越重,能渲染的页面数越少。
怎么判断蜘蛛看到了什么
可以结合访问日志和搜索控制台的工具:看蜘蛛是否请求了 JS 文件,是否在 HTML 之后又请求了接口或资源。如果日志里只有 HTML,没有 JS,说明渲染可能没发生。也可以对比“原始 HTML 里的链接数”和“渲染后的链接数”,差距越大,风险越高。
如果发现关键 URL 只出现在渲染后,优先改内链结构,而不是一味催抓。把入口写进原始 HTML,再让 Sitemap 做清单补充,两条通道配合,URL 发现会更稳。