很多蜘蛛池入口頁並不是把連結寫在 HTML 里,而是用前端脚本拼出目标 URL,再插到頁面上。這種頁面在浏览器里看起来正常,但搜尋蜘蛛拿到源碼时可能什么都看不到。于是問题就變成:搜尋蜘蛛到底會不會执行脚本,把連結补出来?
搜尋蜘蛛處理入口頁的两個阶段
抓取一個頁面,搜尋引擎通常分两步走。第一步是取回原始 HTML,解析其中已有的連結、图片和脚本资源;第二步是决定是否把頁面排進渲染队列,用類似浏览器的环境执行脚本,拿到脚本跑完之後的 DOM,再從里面补充一批新的 URL。
第一步基本一定會發生,第二步則取决于頁面的重要程度、渲染资源的調度情况以及是否有必要。所以,纯 JS 注入的連結處在“可能被發現、也可能一直不被發現”的中間狀態,它不是一條稳定通道。
三種 JS 注入方式的差別
URL 字符串直接寫在 HTML 的脚本里
如果目标連結以文本形式出現在源碼的 <script> 块中,即便没有渲染,抓取阶段也可能把它当作疑似 URL 提取出来。但這属于顺带捞到:連結的上下文和锚文本不完整,發現之後是否跟進也不确定,不能当主力手段。
通過接口异步取回資料再插入 DOM
連結来自後端接口,由脚本拿到 JSON 後再生成 DOM,源碼里只有一個接口地址,看不到任何目标 URL。這類入口頁几乎必须依赖渲染抓取,而渲染抓取有排队、超时、失敗重试等不确定因素,連結被漏掉很常见。
需要点击、滚動或等待才出現
連結藏在折叠区、Tab 切換或者懒加载里,只有在交互之後才插入頁面。渲染抓取一般不會主動模拟复杂交互,這類連結被發現的可能性最低。
怎么判断你的入口頁属于哪一種
- 禁用浏览器 JS,或者直接用抓取工具看原始 HTML,目标連結還在不在。
- 翻服務器日誌,区分普通抓取和渲染抓取(渲染請求常带特定 UA 标识或来自不同 IP 段)。
- 查看抓取快照,確認里面有没有脚本执行後才出現的連結。
- 對比“入口頁被訪問次數”和“目标 URL 被訪問次數”,两者長期不匹配,往往說明連結没有被有效解析。
更稳妥的做法
- 把關键連結放進服務端輸出的 HTML,尽量安排在首屏内容里。
- 确實要用脚本,也先輸出基础 HTML 再用 JS 增强,而不是给搜尋蜘蛛一個空壳頁面。
- 入口頁不是唯一渠道,把 sitemap、URL 提交接口作為冗余一起使用。
- 用日誌逐個核對目标 URL 的抓取情况,別只看入口頁有没有被抓。
渲染抓取只是把“被發現的概率”抬高一点,它既不等于收錄,也不等于目标 URL 一定會被抓取。不要把發現連結這件事押在單一环节上。
几個容易踩的誤区
一是把“浏览器里能看到”等同于“搜尋蜘蛛能看到”;二是以為入口頁被抓取,就等于里面的連結都會被跟進;三是發現連結没被抓,就一味加更多入口頁,而不是先解决渲染依赖的問题。入口頁的價值在于提供一條可被解析的路径,路径越简單、越靠前,越容易被走通。