入口頁的作用是让搜尋蜘蛛顺着連結繼續走,但如果這些連結是 JavaScript 現场拼出来的,情况就复杂了。很多人遇到過同样的現象:用浏览器打開一切正常,日誌里却看不到蜘蛛来抓那批新 URL。這一篇把常见寫法和它們的實际表現讲清楚。
先接受一個前提:不同搜尋蜘蛛的 JS 能力差別很大
有的搜尋引擎會把頁面放進渲染队列,用無头浏览器跑一遍再抽取連結,但這個過程有延迟,也受资源预算限制;另一些搜尋蜘蛛對 JS 的支持相對有限,動態插入的連結往往不會進入下一步抓取。
所以要分清两件事:連結能被浏览器看到,和連結能被搜尋蜘蛛当成待抓取 URL 排進队列,不是一回事。前者靠渲染,後者要靠解析加渲染都走通。
几種常见寫法,谁更容易被發現
直接寫在 HTML 里的 a 标簽
最稳的一類。只要 HTML 源碼里存在 href,搜尋蜘蛛在解析 HTML 阶段就能拿到,不需要等渲染。這也是判断問题出在哪一层时,最方便的對照基准。
放在 noscript 里
noscript 的内容在 HTML 源碼中是真實存在的,通常能被解析到。但要注意別重复:如果頁面同时用 JS 輸出一份同样的連結,等于给同一批目标造了两套清單,出問题时不容易排查。另外,只在 noscript 里放連結、正常渲染时又被覆盖掉,效果也並不理想。
用 JS 遍歷數组生成 a 标簽
這類連結在源碼里往往只是一個數组加一個循环。支持渲染的搜尋蜘蛛在渲染完成後能拿到 DOM,但前提是脚本能下载、能执行,資料不依赖額外的异步請求。如果連結是靠 fetch 取回 JSON 再渲染,就要等接口返回,渲染超时或接口被 robots.txt 挡住,連結就丢了。
連結只寫在 JS 字符串或 onclick 里
這種寫法基本只能靠額外規則提取,属于最不保險的一類。如果這批 URL 是运营的重点资源,不值得為了省事放在這種位置。
想提高被發現的概率,可以從這几處下手
- 入口頁的核心連結用服務端渲染或静態 HTML 輸出,JS 只负责交互增强,不负责生成主体連結。
- 關键目标 URL 在頁面上至少出現一次可点击的 a 标簽,而不是只存在于事件處理里。
- 异步資料源不要放在被 robots.txt 拦住的路径下,否則渲染阶段取不到資料。
- 控制單頁連結總量,不要把几萬條 URL 全塞進一個依赖 JS 的列表里。
- 用日誌驗證效果,而不是凭感觉判断。看搜尋蜘蛛有没有真的抓到新加的 URL。
怎么判断是渲染問题,還是別的环节
服務端至少记錄两件事:入口頁本身被抓取的請求,以及目标 URL 被抓取的請求。如果入口頁被抓了、目标 URL 却從没出現過,再回头查看入口頁的 HTML 源碼里到底有没有那批連結。源碼里没有、只有渲染後才有,問题基本就落在渲染這一层。
還有一種情况值得留意:源碼里有連結,日誌里也能看到蜘蛛抓了入口頁,但抓取量遠小于連結數。這通常是抓取配額在起作用,而不是連結没被發現,两者的處理方式完全不同。
渲染不是萬能的。入口頁做成“源碼可见 + 浏览器可点”是最省事的狀態,剩下的不确定性最终都會轉成抓取延迟和 URL 漏抓。
最後提醒一点:入口頁只负责發現 URL,不负责收錄结果。即使連結被顺利發現,目标頁能不能進索引,還要看内容质量、重复度、站点整体情况這些因素。把入口頁结构做干净,能减少一類問题,但別指望它解决全部。