有些站点會遇到一種奇怪現象:抓取日誌里,列表頁被蜘蛛反复訪問,但列表里的詳情頁几乎没被碰過。查看頁面源代碼才發現,詳情連結並不在初始 HTML 里,而是等 JavaScript 执行後才出現。蜘蛛這次訪問拿到的,更像一個空壳。
為什么初始 HTML 没有連結,會切断發現路径
搜尋蜘蛛發現新 URL 的主要方式,是顺着目前頁面 HTML 中可跟随的連結繼續走。如果連結只存在于浏览器渲染後的 DOM 里,蜘蛛在抓取目前 HTML 时看不到它,後續訪問就可能被推迟,甚至完全不做。
這不等于渲染後的頁面一定不能被處理。不同搜尋引擎、不同抓取场景對 JavaScript 的處理能力不一样,但把 URL 發現完全押在渲染上,風險偏高。尤其是列表頁、分頁、導航這類承担發現任務的頁面。
哪些實現最容易让蜘蛛拿到空壳
- 列表内容由前端框架在客戶端异步請求後渲染,初始 HTML 只有骨架。
- “加载更多”按钮通過点击事件追加内容,没有對應的静態分頁連結。
- 轮播、标簽頁、折叠面板里的連結預設隐藏,需要交互才插入 DOM。
- 連結寫成 div 或 span 加 onclick,没有可跟随的 a href。
- 服務器或 CDN 對蜘蛛返回了简化模板、空資料接口,或者缓存了错誤版本。
- robots.txt 屏蔽了 JS、CSS 等渲染所需资源,導致頁面無法完整执行。
先確認蜘蛛看到的和用戶看到的是否一致
排查时不要只看浏览器里的頁面,浏览器已经执行了脚本。更直接的做法是查看原始 HTML 响應,或者用命令行請求頁面,观察返回内容里有没有目标連結。
- 用 curl 或查看源代碼,搜尋列表頁响應中是否包含詳情頁 URL。
- 對比抓取日誌:列表頁訪問次數與詳情頁被發現次數是否嚴重不成比例。
- 检查服務器日誌里列表頁的响應大小,異常偏小往往說明返回的是空壳或错誤頁。
- 確認 robots.txt 没有誤挡渲染资源,也没有针對蜘蛛做特殊的空白返回。
- 用站点抓取工具模拟無 JS 环境,看看能走到第几层。
让關键連結回到初始 HTML 里
處理方向並不复杂:承担 URL 發現任務的連結,尽量在服務端輸出的 HTML 中就能被跟随。
- 列表頁、频道頁、分頁導航做服務端渲染,至少把前若干條和下一頁連結直接輸出。
- “加载更多”保留一個可訪問的静態分頁地址,不要只依赖按钮。
- 用真正的 a 标簽和 href,不要用脚本事件代替連結。
- 重要詳情 URL 可以同时放進 XML Sitemap,作為补充發現渠道。
- 保持内鏈结构稳定,別為了抓取把連結藏起来或只對蜘蛛顯示。
渲染後可见,不等于抓取时可见。蜘蛛發現 URL 的起点,通常還是它拿到的第一份 HTML。
持續观察,而不是一次性修完
改完渲染方式後,抓取日誌里的變化需要時間才能体現。可以按周观察:列表頁响應大小、詳情頁被抓取的數量、新 URL 從發布到首次被抓取的間隔。如果列表頁抓取正常但詳情頁仍然很少出現,就要回头检查内鏈、Sitemap 和服務器响應是否還有断点。
URL 發現不是單靠某一個設定完成的。服務器稳定返回完整 HTML,内鏈可跟随,Sitemap 作為补充,這三件事配合起来,蜘蛛走的路才會顺。