做蜘蛛池的人常遇到一種情况:入口頁在浏览器里打開,連結清清楚楚、点得通;可把日誌翻一遍,搜尋蜘蛛只抓了入口頁的 HTML,後面挂着的目标 URL 一個都没動。差別往往只有一個——那些連結是 JavaScript 渲染出来的,還是直接寫在 HTML 源碼里的。
搜尋蜘蛛到底會不會执行 JavaScript
主流搜尋引擎的爬虫大多具备一定的 JS 渲染能力,但它們走的通常是两段式流程:先把 HTML 抓回去,再排队做渲染,而不是像浏览器那样打開就立刻执行並拿到最终頁面。這就带来几個推论:
- HTML 源碼里就能看到的連結,一般第一轮抓取时就會被發現;
- 靠 JS 動態插入的連結,要等渲染队列排到才可能被看到;
- 渲染资源是有限的,優先級低、歷史表現一般的頁面,等不到渲染並不罕见。
所以“能不能發現”不是一個是非题,而是“在什么時間、什么條件下能被發現”的問题。
入口頁用 JS 生成連結,會带来哪些現實影响
1. 發現時間被拉長
静態連結可能在几小时到几天内被抓,JS 連結則可能拖得更久,甚至一直没進渲染队列。蜘蛛池往往是成批的入口頁,排队成本會被進一步放大。
2. 渲染失敗就等于没有連結
如果入口頁的 JS 依赖外部接口、需要登入態或特定 Cookie,或者接口對蜘蛛 UA 返回空資料,渲染出来的頁面就是一個“没有連結的壳”。這種情况下,入口頁被抓了多少次都没意义。
3. 日誌更难對照
日誌里能看到蜘蛛請求了入口頁 HTML,也能看到它拉了 JS 文件,但渲染動作有时来自另一批出口 IP,因果關系不一定能一一對上,容易誤判成“蜘蛛来過就等于發現過了”。
怎么判断自己的入口頁属于哪種情况
- 用浏览器打開入口頁,查看網頁源代碼,看連結是否存在于初始 HTML 中;
- 用抓取工具模拟蜘蛛 UA 請求入口頁,检查返回内容里有没有目标 URL;
- 對比日誌:蜘蛛是否請求了頁面上的 JS 文件,是否請求了對應的資料接口;
- 回到源头,看目标 URL 自身有没有出現抓取记錄,而不是只看入口頁被抓了多少次。
如果源代碼里有連結、渲染後也有連結,那基本不用太担心;如果只有渲染後才出現,就要接受發現节奏會更慢、更不确定。
想稳妥一点,可以這样處理
- 服務端直出:让入口頁的連結直接出現在初始 HTML 里,這是最省事也最稳定的做法;
- 保留静態兜底:在頁面底部补一组纯静態連結,即使渲染没發生,也有可爬的路径;
- 减少渲染依赖:連結不要依赖接口返回、不要依赖延迟加载、不要依赖用戶点击“展開更多”才出現;
- 配合其他發現渠道:站点地图和搜尋资源平台的 URL 提交可以和蜘蛛池並行使用,没必要只押一條路。
把 JavaScript 渲染当成补充手段,而不是唯一入口。連結离初始 HTML 越近,搜尋蜘蛛發現它的确定性就越高。
小结
入口頁的連結如果全靠 JS 渲染,搜尋蜘蛛並非完全看不到,但發現會更慢、更不稳定,一旦渲染环节出問题就是彻底看不到。想让目标 URL 更稳地被發現,優先把連結寫進初始 HTML;JS 渲染可以做,但別把它当作唯一通路。發現只是第一步,被發現的 URL 後續還要经過抓取和内容评估,這两件事不會因為入口頁做得热闹就自動過關。