常见問题

入口頁連結由 JavaScript 异步渲染出来,搜尋蜘蛛還能發現目标 URL 吗

入口頁的連結如果由 JavaScript 异步渲染,搜尋蜘蛛能否發現目标 URL 並不确定:渲染要排队、有超时、受资源限制。本文梳理蜘蛛處理 JS 連結的大致流程、風險較高的寫法、自查方法,以及更稳妥的 HTML 直出方案。

常见問题

入口頁連結由 JavaScript 异步渲染出来,搜尋蜘蛛還能發現目标 URL 吗

入口頁的連結如果由 JavaScript 异步渲染出来,搜尋蜘蛛還能不能發現里面的目标 URL,答案取决于渲染是否真的發生、發生在什么时候。主流搜尋蜘蛛具备一定的渲染能力,但渲染是“尽力而為”:要排队、有超时、受资源限制。因此在 JS 渲染的連結上,URL 發現的确定性明顯低于直接寫在初始 HTML 里的普通 a 标簽連結。

搜尋蜘蛛處理 JS 連結的大致流程

  • 先抓取初始 HTML,這一步只能看到服務端返回的内容;
  • 如果判断需要渲染,頁面進入渲染队列,延迟可能是几秒,也可能是几天;
  • 渲染时执行 JS,可能重新請求接口、JS 和 CSS 文件;
  • 渲染有超时限制,超时或资源被 robots.txt 屏蔽,通常只保留初始 HTML 的结果;
  • 渲染後新出現的連結,才進入後續的抓取队列。

也就是说,同一批連結,寫死在 HTML 里可能当天就被發現,放在 JS 渲染里可能被推迟,甚至這一轮完全没有被發現。

風險較高的几種寫法

  • 必须点击、滚動或悬停才触發加载的連結;
  • 依赖登入態或後端接口才返回的列表;
  • 接口响應很慢,渲染超时只拿到半截内容;
  • JS、CSS 文件被 robots.txt 屏蔽,渲染根本無法执行;
  • 没有可讀的兜底連結,關掉 JS 後頁面上什么都没有;
  • 連結由 JS 拼接随机參數,每次渲染出的 URL 都不一样。

可以按這個顺序自查

  1. 用站長平台的 URL 检查工具查看渲染後的 HTML,與初始 HTML 對比,確認目标連結是否出現;
  2. 用關閉 JS 的方式請求一次入口頁,看服務端返回的内容里有没有目标連結;
  3. 查服務器日誌:渲染需要的 JS 和接口是否被蜘蛛請求、返回碼是什么;
  4. 看目标 URL 是否出現在抓取日誌里,而不是只看入口頁有没有被訪問。

更稳妥的落地方式

  • 希望被稳定發現的目标 URL,優先用普通 a 标簽寫在初始 HTML 里;
  • 列表首屏和分頁連結尽量服務端渲染;
  • 不要用 onclick 或事件委托替代 href;
  • 用 sitemap 做兜底,减少對渲染的依赖;
  • 單個入口頁的連結數量适度,避免把發現机會摊薄。
渲染是补充手段,不是保證。把 URL 發現建立在“搜尋蜘蛛一定會执行 JS”這個假设上,風險由自己承担。

和入口頁运营相關的几点提醒

做入口頁时,JS 渲染等于在“頁面被訪問”和“連結被發現”之間多插了一步。多一步就多一次失敗可能:渲染队列延後、超时、资源被屏蔽、接口失敗。入口頁放量之後,這些不确定性會被放大,排查也更費劲。

如果目标只是让搜尋蜘蛛接触到更多目标 URL,最省事的做法仍然是:服務端直出 HTML,用普通連結把目标地址列清楚,再用 sitemap 和日誌观察實际抓取情况。渲染方案适合交互复杂的正常站点頁面,不太适合用来做纯粹的 URL 分發。