搜尋抓取

蜘蛛拿到 HTML 之後:渲染队列與 JS 連結的發現时机

蜘蛛抓取頁面通常分两步:先拿原始 HTML,再可能進入渲染队列。JS 生成的連結發現更晚,也可能不被执行。本文說明两阶段連結可见性的差异,以及如何把關键入口放回原始 HTML,配合 Sitemap 和内鏈,让 URL 發現更稳定。

搜尋抓取

蜘蛛拿到 HTML 之後:渲染队列與 JS 連結的發現时机

蜘蛛抓取一個頁面,通常不是“下载完 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 發現會更稳。