搜尋抓取

搜尋蜘蛛抓取:JS 渲染内容與原始 HTML 入口缺失的排查顺序

前端渲染普及後,不少站点在原始 HTML 里只剩空壳,連結和正文都要等 JS 执行後才出現。本文按入口缺失與内容缺失两類問题拆解,给出用原始請求做基线、检查連結寫法、核對预渲染分流、用抓取日誌驗證效果的排查顺序,帮助把 URL 發現和内容輸出拉回稳定通道。

搜尋抓取

搜尋蜘蛛抓取:JS 渲染内容與原始 HTML 入口缺失的排查顺序

頁面在浏览器里看着完整,抓取到的 HTML 里却只剩一句“請開啟 JavaScript”,這是不少站点改為前端渲染後遇到的典型問题。搜尋蜘蛛虽然具备一定的渲染能力,但渲染是排在原始 HTML 之後的第二道工序,成本更高,触發條件也更苛刻。把入口和内容都押在渲染之後,等于给抓取人為加了一层不确定的门槛。

先分清两種缺失:入口缺失和内容缺失

排查前先把問题分類,否則容易在错誤的方向上反复調整。

  • 入口缺失:連結本身不在原始 HTML 中,蜘蛛拿不到 URL,也就谈不上抓取内容。
  • 内容缺失:URL 能被發現,但原始 HTML 里没有正文,需要渲染後才出現。

入口缺失比内容缺失更嚴重。内容缺失最多是渲染环节没跟上,入口缺失則會让整批 URL 長期進不了發現队列。

用原始請求结果做基线

不要只依赖浏览器的“查看源代碼”,部分框架在開發模式下會注入調试脚本,和服務端真實返回並不一致。更可靠的做法是發一次不带 Cookie 的普通 GET 請求,把响應体儲存下来。

  1. 用命令行工具請求目标 URL,把原始 HTML 存成文件。
  2. 在文件里搜尋目标連結的路径片段,確認連結是否存在于源碼。
  3. 搜尋正文首段的獨有词句,確認内容是否在原始响應中。
  4. 與浏览器渲染後的 DOM 對比,列出差异部分。

常见的入口寫法問题

  • 用 onclick 或事件监听代替 a 标簽的 href。
  • href 寫成 javascript:void(0) 或 #,真實地址藏在 data 属性里。
  • 列表内容由前端請求接口後拼接,首屏 HTML 中没有任何連結。
  • 分頁和“加载更多”只做滚動触發,没有可抓取的静態分頁地址。

内鏈尽量落在 HTML 里

内鏈是 URL 發現最稳定的通道。導航、面包屑、相關推荐、分頁,這几類連結建议在服務端渲染时直接輸出。即便主体内容需要 JS 渲染,連結這一层也值得單獨做服務端輸出。

如果使用预渲染或同构渲染,要检查预渲染服務是否對蜘蛛和普通用戶返回一致的 HTML。部分配置會按 UA 分流,一旦規則寫错,蜘蛛拿到的可能是空白壳頁。

渲染能力有限,別把它当作預設通路

渲染有超时,有资源加载失敗的可能,也會受頁面体积影响。把關键内容放到渲染之後,等于把抓取的稳定性交给执行环境。

判断标准很简單:禁用 JavaScript 後打開頁面,核心内容和主要連結是否還在。如果不在,說明這部分内容對抓取而言是奢侈品,而不是必需品。

用抓取日誌驗證修复效果

  • 看目标目錄的整体抓取請求量是否上升,而不是只盯單個 URL。
  • 检查日誌中的响應体大小,壳頁通常体积很小且高度接近。
  • 观察渲染請求與原始請求的比例是否在變化。

修复後不要期待立刻见效,URL 的發現和回訪有自己的节奏,一般按周观察趋势更合适。重点看方向:原始 HTML 中的連結數、正文文本量、日誌里的抓取覆盖是否在稳步增加。

小结

JS 渲染不是不能用,而是不该成為唯一通路。把連結放回 HTML,把核心内容保留一份服務端輸出,再让渲染去做锦上添花的部分,抓取的确定性會明顯提升。