越来越多的站点用 JavaScript 拼装頁面:商品列表、评论区、文章正文都可能在浏览器里才被填進 DOM。對用戶来说這没問题,但對蜘蛛来说,它第一眼看到的東西可能和你打開頁面时看到的完全不是一回事。這也是不少頁面「内容明明很完整,却迟迟没有收錄」的原因之一。
抓取和渲染是分開的两步
蜘蛛處理一個 URL,大致會经歷两個阶段:
- 抓取原始响應:服務器返回的 HTML 源碼,此时脚本通常還没执行,頁面可能是空壳。
- 排队渲染:把頁面放進渲染队列,执行 JavaScript,拿到渲染後的 DOM,再從中提取文字和連結。
渲染是有成本的环节,需要排队,也未必每個 URL 都會被渲染。這意味着只有在脚本跑完之後才出現的内容,被看到的概率和时机,都不如直接寫在 HTML 里稳定。
這几種寫法最容易让内容「看不见」
- 正文、價格、库存等關键信息全靠接口返回後再插入,初始 HTML 里只有一句「加载中」。
- 内鏈靠点击事件或脚本生成,a 标簽没有真實的 href,蜘蛛拿不到下一跳地址。
- 内容藏在标簽頁、折叠面板、「查看更多」之後,需要交互才出現。
- 懒加载把首屏之外的内容全部留到滚動时再取,而渲染阶段可能已经結束。
- 無限滚動不产生新的 URL,翻十屏的内容在索引里只是同一頁。
- 用 canvas、图片上的文字、CSS 伪元素承载正文,文字根本不在 DOM 里。
怎么確認蜘蛛到底看到了什么
- 用命令行工具取一次原始响應,或直接查看網頁源代碼,確認初始 HTML 里有没有你要收錄的文字和連結。注意是「查看源代碼」,不是浏览器里的「检查元素」。
- 在搜尋引擎提供的 URL 检查工具里對比抓取结果與渲染截图,看两邊内容是否一致。
- 临时關掉浏览器 JavaScript 打開頁面,很多問题一眼就能看出来。
- 看服務器日誌里该 URL 的响應体大小,如果長期只有几百字节,返回的多半是空壳。
让關键内容更容易被抓到
- 服務端渲染或静態生成:把一個頁面的核心内容直接輸出進 HTML。
- 预渲染:构建时把常用 URL 生成静態 HTML,适合更新不频繁的頁面。
- 關键内容優先:标题、正文、主要内鏈放在初始 HTML,次要模块再交给脚本。
- 使用真實連結:a 标簽带 href,指向可以被抓取的 URL,不要只寫点击事件。
- 分頁保留獨立 URL:即使前端用無限滚動,也给一個可訪問的翻頁地址。
渲染是补充,不是替代
搜尋引擎的渲染能力确實在提升,但渲染有排队、有超时、有失敗率,也不是所有頁面都會走到這一步。把所有内容都押在客戶端渲染上,等于把「能不能被看见」交给了一個不完全可控的环节。更稳的做法,是让 HTML 本身就能說明這個頁面是什么。
判断标准很简單:如果關掉 JavaScript,這個頁面還剩多少能讀懂的内容?剩下的那一部分,才是蜘蛛最稳的那一份。
收錄問题,很多时候不是頁面质量不够,而是内容根本没進入「可被评估」的狀態。先確認蜘蛛看到的内容和你看到的一致,再谈其他優化,顺序會顺很多。