現在不少站点為了交互体驗,會用到Ajax、异步加载、動態渲染這類手段。比如列表頁滚動到底部通過JS再拉取新資料,或点击某個按钮才把連結拼出来。這種设計對普通用戶没問题,但搜尋蜘蛛来抓URL时,它看到的HTML可能只是一堆空壳,真正的連結藏在後續执行的JS里。于是很多站長會有疑問:异步JS注入的連結,蜘蛛到底能不能發現?
搜尋蜘蛛“看到”的两種頁面
要理解這個問题,得先厘清搜尋蜘蛛抓取網頁时的處理逻辑。通常蜘蛛先請求URL获取HTML源碼,這一步相当于看頁面的原始骨架。然後為了识別一些由JS動態呈現的内容,部分搜尋引擎的爬虫會二次执行JavaScript,模拟浏览器渲染後再提取連結和文本。不過,执行JS並不等于所有脚本都能完整跑完,它受超时、资源加载條件、脚本复杂度等因素影响。
對于异步JS来说,連結往往不是直接寫在HTML源碼里,而是通過事件触發或請求接口後由前端代碼建立。如果蜘蛛不交互、不点击、不滚動,或者等到資料返回前就結束了渲染,那么這些後注入的連結就會漏掉。简單说,蜘蛛能不能發現這類URL,取决于它是否执行了JS以及执行到什么程度,並没有统一的保證。
异步JS連結容易造成哪些問题?
- 新連結發現延迟。一個頁面里所有内容都由JS生成,蜘蛛只能抓到初始狀態下的URL,後續動態加载出来的新連結可能要等到蜘蛛下次升級或走了其他入口才能被發現。
- 内鏈權重出現空洞。如果這些异步連結承担着站内重要的導航、推荐位或翻頁功能,蜘蛛抓不到它們,那么對應頁面获得的“從首頁抵達”的信号就弱了,整体抓取權重分配會不均衡。
- 與Sitemap出現裂缝。Sitemap里提交了URL,但頁面内實际連結却因JS没被蜘蛛發現,導致蜘蛛即便知道URL,也可能認為它缺少頁面内的上下文或相關性證明。
- 誤判頁面质量。如果蜘蛛执行JS後頁面仍空白或很單薄,頁面價值评估也會受影响,間接影响URL的收錄優先級。
先判断自己站点是否存在這個問题
判断方法不复杂:用浏览器的“查看源代碼”功能搜尋重要連結是否存在。如果連結只在開發者工具里能看到,而源代碼里找不到,那就有依赖JS注入的情况。另一個更直接的办法是關閉浏览器JavaScript後再打開頁面,看看連結是否消失。如果消失了,說明搜尋蜘蛛在首次抓取时很大概率也看不到它們。
需要留意的是,搜尋引擎優化界有一種观点是“蜘蛛已经能执行JS,所以不用怕”。但實际測試中,执行JS的時間、资源有限,而且搜尋引擎更偏好把抓取预算用在稳定可获取的内容上。面對不确定,站長應该采取更保守的做法。
让URL即使不加载JS也能被發現
關键頁面與關键内鏈,不要用异步加载来隐藏。具体可以從几個方向入手。
- 服務端渲染或预渲染。對于列表頁、栏目頁這類需要引導蜘蛛進入的頁面,尽量在服務端輸出完整的HTML連結,而不是完全靠前端拼凑。
- 把异步内容同步一份给蜘蛛。如果必须使用异步,則可以在頁面初始HTML中放置一個隐藏連結区或noscript块,包含同样的連結,让不支持或没有执行JS的蜘蛛也能抓到。
- 用常規静態連結承载重要跳轉。比如“查看更多”“下一頁”這類關键路径,寫死為普通a标簽,避免依赖点击事件。
- 保持Sitemap更新及时。Sitemap是蜘蛛發現URL的兜底渠道。异步JS再复杂,Sitemap都能稳定告诉蜘蛛哪些URL存在。
- 通過外部可见連結补充。有條件的话,让站外的一些高质頁面直接指向這些异步URL,给蜘蛛提供一條不依赖JS的發現路径。
记住:URL發現的前提是蜘蛛能“看见”那條連結。任何需要用戶交互才能出現的連結,對蜘蛛来说都相当于捉迷藏。把最重要的路径放到初始HTML里,是日常站点运营中最不費力又最不容易出错的习惯。
回到蜘蛛池运营的场景,管理大量URL和抓取關系时,更要重视這種技術细节。如果池子里的頁面普遍用异步JS注入連結,蜘蛛池整体的抓取效率都會打折扣。與其事後反复調整,不如在建站或改版时就养成“連結裸露”的意识。让URL以最直接的方式出現在蜘蛛面前,才不會被發現机制的漏洞拦在门外。