先理解搜尋蜘蛛對 JS 的處理
搜尋蜘蛛抓取頁面时,第一遍通常只拿到服務器返回的 HTML 源碼。如果入口頁里的連結是 JavaScript 執行後再插入 DOM 的,源碼里可能完全没有這些 URL。搜尋引擎會有一個渲染队列,把需要执行 JS 的頁面排進去,但渲染有延迟、有配額,也不保證每個頁面都會走到渲染這一步。
不同搜尋引擎的渲染能力不一样。有的渲染較快,有的主要依赖静態 HTML;同一個搜尋引擎,入口頁權重低、抓取频率低时,渲染队列也可能排得更久。所以把 URL 發現完全押在 JS 連結上,風險較高。
哪些寫法容易被漏掉
- 用 document.write 或 innerHTML 批量插入的 a 标簽,源碼里没有 href。
- 点击按钮後才通過事件监听跳轉,且没有可爬取的 a 标簽。
- 連結放在前端框架的组件里,服務端返回的只是空壳 HTML。
- 用 JS 拼接 URL,例如 base + id,蜘蛛看不到最终地址。
這些寫法對用戶可能正常,對搜尋蜘蛛的 URL 發現就不一定友好。
更稳妥的入口頁做法
如果目的是让搜尋蜘蛛發現目标 URL,入口頁優先用服務端能輸出的静態 a 标簽。連結直接寫在 HTML 里,href 是完整或可解析的 URL,蜘蛛第一遍抓取就能看到。
- 服務端渲染(SSR)或静態生成,把連結輸出到源碼。
- 如果必须用前端框架,使用预渲染,给爬虫返回带連結的 HTML。
- 在 noscript 中放一份關键連結,但不要只依赖 noscript。
- 分頁或列表入口保留传统 a 标簽,不全部改成按钮点击。
注意:noscript 里的連結不是所有搜尋引擎都會跟進,能静態輸出时優先静態輸出。
已经用了 JS,怎么检查有没有被發現
可以看服務器日誌和搜尋蜘蛛的抓取记錄。重点观察两点:蜘蛛有没有請求入口頁的 JS 文件;請求 JS 之後,有没有接着請求目标 URL。如果只看到入口頁和 JS 文件被請求,目标 URL 一直不出現,說明渲染後連結可能没有被执行或没有被跟進。
還可以做小范围測試:把其中几條連結改成静態 a 标簽,观察日誌里目标 URL 是否更快出現。對照測試比單纯猜测可靠。
蜘蛛池投放时怎么配合
蜘蛛池的作用是提供更多入口和抓取路径,但它不能替代入口頁本身的可抓取性。入口頁如果是纯 JS 連結,蜘蛛池带来的抓取可能只停在入口頁。把入口頁改成静態連結,或者让蜘蛛池入口指向已经静態輸出連結的頁面,URL 發現效率通常更可控。
另外,不要為了 JS 連結而堆砌大量入口頁。連結數量不是越多越好,入口頁质量、連結是否可解析、目标頁是否可訪問,這些都會影响發現效果。投放後持續看日誌,按實际抓取情况調整,而不是一次性铺開就不管。