搜尋抓取

CSS、JS 與图片加载失敗,會影响蜘蛛抓取和連結發現吗

蜘蛛抓取頁面时,除了 HTML,還會請求 CSS、JS、图片等资源。這些請求的成败與快慢,會影响渲染後的連結能否被發現。本文梳理资源层常见的三類問题——robots.txt 誤拦、超时與並發、CDN 拦截,並给出基于日誌的排查步骤和處理建议。

搜尋抓取

CSS、JS 與图片加载失敗,會影响蜘蛛抓取和連結發現吗

大多數關于抓取的讨论都集中在 HTML 上:連結寫在哪、层級有多深、代碼是不是服務端輸出。但蜘蛛實际工作时,除了下载 HTML,還可能去請求頁面里引用的 CSS、JavaScript、图片和字体文件。這些资源不參與内容索引,却會占用抓取請求、影响渲染结果,甚至在服務器吃紧时把一次抓取拖成超时。

蜘蛛為什么還會請求頁面资源

纯文本抓取只需要 HTML,用来提取正文和連結。但当搜尋引擎需要對頁面做渲染时,它會像浏览器一样加载關键资源,尤其是 JS 文件,然後把渲染後的 DOM 拿来提取連結和内容。這意味着一個頁面被請求一次,並不等于只消耗一次服務端請求。

所以资源层出問题,不一定让頁面從索引里消失,但可能让蜘蛛看到一份不完整的頁面:導航没渲染出来、列表是空的、分頁連結不见踪影。對依赖前端渲染的站点来说,這一层值得單獨检查。

资源层最常见的三類問题

robots.txt 誤拦静態目錄

有些站点為了防止图片被盗或降低负载,會在 robots.txt 里寫 Disallow: /static/,或者整目錄屏蔽 JS、CSS。這样蜘蛛确實拿不到资源,渲染出来的頁面就可能缺連結、缺内容。屏蔽静態资源要分清目的:如果只是不想让图片出現在图片搜尋里,可以用 noindex 或针對具体路径處理,而不是连带把渲染所需的脚本一起挡掉。

资源超时與服務器並發

蜘蛛請求资源同样受超时限制。当同一個頁面要拉几十個脚本、样式和小图,而服務器响應又慢,抓取時間會明顯拉長,蜘蛛可能在资源没加载完时就放弃渲染。CDN 回源慢、合並文件缺失、大量未压缩的图片,都會加剧這種情况。合並和压缩资源、给静態文件設定長缓存,既能减轻用戶端压力,也間接改善了蜘蛛的渲染成功率。

CDN 或安全防護把蜘蛛拦在门外

部分站点啟用了較嚴格的防火墙策略,蜘蛛請求静態资源时被判定為異常流量,返回驗證頁或直接断開。表現是 HTML 抓取正常,但资源請求大量 403、429 或超时。這種情况最容易被忽略,因為在浏览器里訪問一切正常。

资源加载失敗會不會影响連結發現

要分两種情况看:

  • 連結寫在 HTML 里:蜘蛛下载 HTML 就能拿到,资源挂了也不影响這部分 URL 的發現。
  • 連結靠 JS 生成:脚本没加载或执行失敗,連結就不會出現在 DOM 里,蜘蛛自然也走不到下一頁。

換句话说,連結發現是否依赖资源,取决于連結是寫在源碼里還是執行时生成的。判断方法很简單:關掉 JavaScript 看看導航和列表里還有没有可点的連結。如果全都没了,那這些路径的稳定性就绑在资源层上。

排查思路

  1. 在服務器日誌里按蜘蛛 UA 過滤静態资源路径,看它們的狀態碼分布,重点看 4xx、5xx 和响應時間。
  2. 確認 robots.txt 没有誤拦渲染所需的 JS、CSS 目錄。
  3. 用抓取測試工具對比關閉與開啟 JS 时頁面里連結數量的差异。
  4. 抽查慢頁面,看看是不是單個资源拖了几秒。
  5. 检查 CDN 日誌里有没有针對蜘蛛的拦截規則或限速命中。

處理建议

  • 關键導航和列表連結尽量保留在 HTML 里,作為 JS 渲染失敗时的兜底。
  • 静態资源统一走 CDN,設定合理的缓存头,减少回源压力。
  • 把拦截規則和蜘蛛白名單一起复核,避免誤伤。
  • 资源体积做压缩,减少單頁請求數量。
  • 如果站点仍在使用 Sitemap,不要因為“連結反正能渲染出来”就放弃提交,两者是互补的。
资源不是索引的主体,但它决定了蜘蛛能不能看到完整的頁面。把资源层的错誤和超时当成抓取問题的一部分来看,通常比只盯 HTML 更接近真實情况。

最後提醒一点:资源层的調整往往不會立刻体現在抓取資料上,观察周期以周為單位比較合理。记錄改動前後的日誌對比,比凭感觉判断更可靠。