不少蜘蛛池入口頁為了省事,用 JavaScript 在前端拼出連結列表:先把頁面框架加载完,再靠一段脚本把目标 URL 插進 DOM。寫頁面的人看得见連結,但搜尋蜘蛛看到的是不是同一份内容,就成了一個常见疑問。
搜尋蜘蛛對 JavaScript 的處理方式
主流搜尋引擎的抓取大致分两步:先抓取服務器返回的原始 HTML,把里面的連結、正文入库;如果頁面必须执行脚本才有内容,再排進渲染队列,用無头浏览器跑一遍,二次提取連結和文本。
關键点在于這两步不是同时發生的。原始 HTML 里没有的連結,只能等渲染那一步才可能被發現,而渲染队列有排队、有額度,也存在放弃的情况。
- 原始 HTML 中直接出現 a 标簽的 href,發現路径最短,也最稳定。
- JS 動態插入的連結依赖渲染,通常會有延迟,快則几分钟到几小时,慢則數天。
- 渲染本身消耗资源,入口頁數量大、内容單薄时,部分頁面可能長期排不上队。
- 脚本报错、接口超时、需要交互或登入才出現的連結,渲染也拿不到。
先確認你的入口頁是不是「JS 依赖」
不要凭感觉判断,用下面几種方式驗證:
- 禁用浏览器 JavaScript,打開入口頁,看目标連結是否還在。
- 用 curl 或抓包工具請求入口頁,直接看响應体里有没有 href。
- 對比「查看源代碼」和「审查元素」面板,两者差异越大,JS 依赖越重。
- 查看服務器日誌,看目标 URL 有没有来自搜尋蜘蛛的請求记錄。
如果源代碼里一條連結都没有,而审查元素里有一堆,那基本可以判断:URL 發現這件事被押後到了渲染环节。
让連結更早被看到的一些做法
- 服務端直出:在 HTML 里就把連結渲染好,前端脚本只做增强,不做唯一資料源。
- 首屏優先:把關键入口連結放在 HTML 靠前的位置,別等整頁脚本执行完才插入。
- 兜底連結:在 noscript 中放一份同样的連結,但它只是补充,不能当作唯一方案。
- 控制入口頁体量:一個入口頁塞几千條連結,容易让真正重要的連結被稀释。
- 配合 sitemap:把希望被發現的 URL 單獨整理提交,减少對渲染的依赖。
這些調整只是提高 URL 被發現的概率和速度,並不能保證被收錄,也不能保證排名。發現、抓取、索引是三件不同的事。
几個容易踩的誤区
- 以為「浏览器里能看到」等于「蜘蛛能看到」,两者的执行环境並不相同。
- 以為 noscript 里的連結一定會被采信,實际不同引擎的處理策略有差別。
- 用 JS 動態生成 sitemap 地址,结果提交的内容本身也要渲染才能拿到。
- 只看蜘蛛有没有来,不区分原始抓取和渲染抓取,把两種 UA 混為一谈。
怎么驗證連結是否真的被發現
最直接的證據還是日誌。观察目标 URL 的請求记錄,看訪問時間、UA、請求频率,判断是原始抓取带来的還是渲染抓取带来的。站内可以用抓取诊断類工具查看某條 URL 的 HTML 快照,對比快照里是否包含你的連結。如果連結長期只在渲染後才出現,說明入口頁结构确實需要調整。
结论:JS 動態插入的連結並不是完全没机會被發現,但它把「發現」推给了一條更慢、更不确定的通道。入口頁作為 URL 發現的载体,連結越早出現在原始 HTML 里,越省事。