蜘蛛抓取一個頁面,通常不是“下载完 HTML 就結束”。對很多站点来说,真正的 URL 發現發生在两個阶段:先是服務器返回的原始 HTML,然後是渲染後的 DOM。两阶段里連結的可见性不一样,抓取路径也會不同。
第一阶段:原始 HTML 里的連結
蜘蛛請求一個 URL,拿到响應体。如果响應是 HTML,它會先解析原始代碼,把 a 标簽的 href、link 标簽等提取出来。這些連結會進入待抓取队列。這個阶段不依赖 JS 执行,速度最快,也最稳定。
所以,導航、面包屑、文章列表、分頁這些關键路径,最好能在原始 HTML 里找到。你可以在浏览器里禁用 JS 查看源代碼,或者在命令行用 curl 拿一份 HTML,看看連結是否還在。
第二阶段:渲染後的連結
有些站点用 JS 在客戶端生成列表、加载更多、推荐模块。蜘蛛可能會把這類頁面放入渲染队列,等资源执行完再提取連結。但渲染不是免費的:它要占用額外资源,也可能因為超时、资源加载失敗而放弃。即使渲染成功,連結的發現時間也會比原始 HTML 晚。
更麻烦的是,如果連結只存在于点击事件或滚動加载里,蜘蛛不一定會触發。它不會像人一样無限滚動,也不一定点击每個按钮。因此,“用戶能看到”不等于“蜘蛛能發現”。
把關键連結放回原始 HTML
- 主導航和分類入口用 a 标簽,href 指向真實 URL,不用 onclick 跳轉。
- 列表頁第一頁的條目尽量服務端輸出,分頁連結用可抓取的 a 标簽。
- “加载更多”如果只是按钮,可以配一個指向下一頁的普通連結作為兜底。
- Sitemap 可以补充那些藏在 JS 里的 URL,但它不能替代内鏈的權重传递。
渲染队列與抓取预算
渲染一個頁面往往要再請求 JS、CSS、图片等资源。對服務器来说,這是一次抓取變成多次請求;對蜘蛛来说,渲染队列的容量有限。如果大量頁面都依赖渲染,蜘蛛可能只渲染一部分,剩下的頁面連結就發現不了。
抓取预算不是只算 HTML 請求,渲染带来的资源請求也會占份額。頁面越重,能渲染的頁面數越少。
怎么判断蜘蛛看到了什么
可以结合訪問日誌和搜尋控制台的工具:看蜘蛛是否請求了 JS 文件,是否在 HTML 之後又請求了接口或资源。如果日誌里只有 HTML,没有 JS,說明渲染可能没發生。也可以對比“原始 HTML 里的連結數”和“渲染後的連結數”,差距越大,風險越高。
如果發現關键 URL 只出現在渲染後,優先改内鏈结构,而不是一味催抓。把入口寫進原始 HTML,再让 Sitemap 做清單补充,两條通道配合,URL 發現會更稳。