頁面在浏览器里看着完整,抓取到的 HTML 里却只剩一句“請開啟 JavaScript”,這是不少站点改為前端渲染後遇到的典型問题。搜尋蜘蛛虽然具备一定的渲染能力,但渲染是排在原始 HTML 之後的第二道工序,成本更高,触發條件也更苛刻。把入口和内容都押在渲染之後,等于给抓取人為加了一层不确定的门槛。
先分清两種缺失:入口缺失和内容缺失
排查前先把問题分類,否則容易在错誤的方向上反复調整。
- 入口缺失:連結本身不在原始 HTML 中,蜘蛛拿不到 URL,也就谈不上抓取内容。
- 内容缺失:URL 能被發現,但原始 HTML 里没有正文,需要渲染後才出現。
入口缺失比内容缺失更嚴重。内容缺失最多是渲染环节没跟上,入口缺失則會让整批 URL 長期進不了發現队列。
用原始請求结果做基线
不要只依赖浏览器的“查看源代碼”,部分框架在開發模式下會注入調试脚本,和服務端真實返回並不一致。更可靠的做法是發一次不带 Cookie 的普通 GET 請求,把响應体儲存下来。
- 用命令行工具請求目标 URL,把原始 HTML 存成文件。
- 在文件里搜尋目标連結的路径片段,確認連結是否存在于源碼。
- 搜尋正文首段的獨有词句,確認内容是否在原始响應中。
- 與浏览器渲染後的 DOM 對比,列出差异部分。
常见的入口寫法問题
- 用 onclick 或事件监听代替 a 标簽的 href。
- href 寫成 javascript:void(0) 或 #,真實地址藏在 data 属性里。
- 列表内容由前端請求接口後拼接,首屏 HTML 中没有任何連結。
- 分頁和“加载更多”只做滚動触發,没有可抓取的静態分頁地址。
内鏈尽量落在 HTML 里
内鏈是 URL 發現最稳定的通道。導航、面包屑、相關推荐、分頁,這几類連結建议在服務端渲染时直接輸出。即便主体内容需要 JS 渲染,連結這一层也值得單獨做服務端輸出。
如果使用预渲染或同构渲染,要检查预渲染服務是否對蜘蛛和普通用戶返回一致的 HTML。部分配置會按 UA 分流,一旦規則寫错,蜘蛛拿到的可能是空白壳頁。
渲染能力有限,別把它当作預設通路
渲染有超时,有资源加载失敗的可能,也會受頁面体积影响。把關键内容放到渲染之後,等于把抓取的稳定性交给执行环境。
判断标准很简單:禁用 JavaScript 後打開頁面,核心内容和主要連結是否還在。如果不在,說明這部分内容對抓取而言是奢侈品,而不是必需品。
用抓取日誌驗證修复效果
- 看目标目錄的整体抓取請求量是否上升,而不是只盯單個 URL。
- 检查日誌中的响應体大小,壳頁通常体积很小且高度接近。
- 观察渲染請求與原始請求的比例是否在變化。
修复後不要期待立刻见效,URL 的發現和回訪有自己的节奏,一般按周观察趋势更合适。重点看方向:原始 HTML 中的連結數、正文文本量、日誌里的抓取覆盖是否在稳步增加。
小结
JS 渲染不是不能用,而是不该成為唯一通路。把連結放回 HTML,把核心内容保留一份服務端輸出,再让渲染去做锦上添花的部分,抓取的确定性會明顯提升。