搜尋抓取

蜘蛛抓到的是空壳頁面:渲染失敗如何切断後續 URL 發現

抓取日誌里列表頁常被訪問,詳情頁却迟迟不出現,很多时候不是服務器拒绝,而是蜘蛛拿到的初始 HTML 没有可跟随連結。本文從空壳頁面現象出發,說明客戶端渲染、加载更多、隐藏連結和资源屏蔽如何影响 URL 發現,並给出用原始响應排查、把關键連結放回 HTML、配合 Sitemap 與日誌观察的做法。

搜尋抓取

蜘蛛抓到的是空壳頁面:渲染失敗如何切断後續 URL 發現

有些站点會遇到一種奇怪現象:抓取日誌里,列表頁被蜘蛛反复訪問,但列表里的詳情頁几乎没被碰過。查看頁面源代碼才發現,詳情連結並不在初始 HTML 里,而是等 JavaScript 执行後才出現。蜘蛛這次訪問拿到的,更像一個空壳。

為什么初始 HTML 没有連結,會切断發現路径

搜尋蜘蛛發現新 URL 的主要方式,是顺着目前頁面 HTML 中可跟随的連結繼續走。如果連結只存在于浏览器渲染後的 DOM 里,蜘蛛在抓取目前 HTML 时看不到它,後續訪問就可能被推迟,甚至完全不做。

這不等于渲染後的頁面一定不能被處理。不同搜尋引擎、不同抓取场景對 JavaScript 的處理能力不一样,但把 URL 發現完全押在渲染上,風險偏高。尤其是列表頁、分頁、導航這類承担發現任務的頁面。

哪些實現最容易让蜘蛛拿到空壳

  • 列表内容由前端框架在客戶端异步請求後渲染,初始 HTML 只有骨架。
  • “加载更多”按钮通過点击事件追加内容,没有對應的静態分頁連結。
  • 轮播、标簽頁、折叠面板里的連結預設隐藏,需要交互才插入 DOM。
  • 連結寫成 div 或 span 加 onclick,没有可跟随的 a href。
  • 服務器或 CDN 對蜘蛛返回了简化模板、空資料接口,或者缓存了错誤版本。
  • robots.txt 屏蔽了 JS、CSS 等渲染所需资源,導致頁面無法完整执行。

先確認蜘蛛看到的和用戶看到的是否一致

排查时不要只看浏览器里的頁面,浏览器已经执行了脚本。更直接的做法是查看原始 HTML 响應,或者用命令行請求頁面,观察返回内容里有没有目标連結。

  1. 用 curl 或查看源代碼,搜尋列表頁响應中是否包含詳情頁 URL。
  2. 對比抓取日誌:列表頁訪問次數與詳情頁被發現次數是否嚴重不成比例。
  3. 检查服務器日誌里列表頁的响應大小,異常偏小往往說明返回的是空壳或错誤頁。
  4. 確認 robots.txt 没有誤挡渲染资源,也没有针對蜘蛛做特殊的空白返回。
  5. 用站点抓取工具模拟無 JS 环境,看看能走到第几层。

让關键連結回到初始 HTML 里

處理方向並不复杂:承担 URL 發現任務的連結,尽量在服務端輸出的 HTML 中就能被跟随。

  • 列表頁、频道頁、分頁導航做服務端渲染,至少把前若干條和下一頁連結直接輸出。
  • “加载更多”保留一個可訪問的静態分頁地址,不要只依赖按钮。
  • 用真正的 a 标簽和 href,不要用脚本事件代替連結。
  • 重要詳情 URL 可以同时放進 XML Sitemap,作為补充發現渠道。
  • 保持内鏈结构稳定,別為了抓取把連結藏起来或只對蜘蛛顯示。
渲染後可见,不等于抓取时可见。蜘蛛發現 URL 的起点,通常還是它拿到的第一份 HTML。

持續观察,而不是一次性修完

改完渲染方式後,抓取日誌里的變化需要時間才能体現。可以按周观察:列表頁响應大小、詳情頁被抓取的數量、新 URL 從發布到首次被抓取的間隔。如果列表頁抓取正常但詳情頁仍然很少出現,就要回头检查内鏈、Sitemap 和服務器响應是否還有断点。

URL 發現不是單靠某一個設定完成的。服務器稳定返回完整 HTML,内鏈可跟随,Sitemap 作為补充,這三件事配合起来,蜘蛛走的路才會顺。