把入口頁做成單頁應用,用 JavaScript 在浏览器里動態拼出目标 URL 的連結,是不少蜘蛛池的常见做法。好處是灵活、方便換連結,問题在于:不同搜尋蜘蛛的渲染能力差异很大,能不能發現這些連結,取决于它是否愿意执行你的脚本、执行到什么程度,以及脚本本身會不會被拦住。
抓取和渲染,是两步不是一步
搜尋蜘蛛處理一個頁面大致分两步:先取原始 HTML,再决定要不要渲染。渲染並不是所有蜘蛛都會做,也不一定每次訪問都做。有的蜘蛛只拿 HTML 源碼,源碼里没有連結,它就認為這個頁面没有可跟随的 URL,直接結束這一轮。所以完全依赖 JS 輸出連結,等于把發現目标 URL 的主動權交了出去。
三種常见寫法,風險依次升高
連結直接寫在 HTML 里
最稳。源碼里就是完整的 a 标簽,對方渲不渲染都能解析出目标 URL。這是推荐做法,也是判断其他方案好坏时的基准线。
用 JS 拼接後插入 DOM
源碼里通常只有一個空容器或一段脚本。支持渲染的蜘蛛有机會拿到連結,不支持的拿不到。而且渲染有時間预算,脚本依赖的接口慢一点或者报错,就可能什么都渲染不出来,白跑一趟。
需要交互才出現
点击按钮、滚動到底部、切換标簽頁之後才加载連結。這種寫法對蜘蛛最不友好,绝大多數情况下這些動作不會被触發,連結也就無從發現。
- 源碼里就有連結:被發現几乎没有悬念。
- 渲染之後才有連結:可能被發現,也可能不會,取决于對方這次是否渲染。
- 交互之後才有連結:基本不會被發現。
先自查:源碼里到底有没有連結
- 用浏览器的“查看網頁源代碼”打開入口頁,注意不是開發者工具里的元素面板。
- 在源碼里搜尋目标域名或路径關鍵詞。搜得到,說明連結是硬编碼的;搜不到,說明依赖渲染。
- 用抓取工具發一次只取 HTML、不执行脚本的請求,對比返回内容和浏览器看到的是否一致。
- 在浏览器里禁用 JavaScript 後刷新頁面,看還能不能看到目标連結。
如果第二步就搜不到,那這批目标 URL 的發現效率基本靠运气,後續再怎么優化入口頁的排版和更新频率,作用也有限。
一定要用 JS 的话,可以多做這几件事
- 首屏放一批硬编碼連結,把重点目标 URL 寫進 HTML,動態部分只做补充。
- 把動態内容改成服務端渲染或预渲染,让返回的 HTML 里就带 a 标簽。
- 渲染所依赖的接口要快且稳定,別让頁面在超时前什么都没輸出。
- 關键連結不要放在需要点击、滚動或登入才出現的位置。
- 保留一份纯文本形式的 URL 作為兜底,至少给對方一個可解析的字符串。
渲染支持是加分項,不是保底項。把發現目标 URL 的希望全押在對方的渲染能力上,等于把最可控的环节主動放弃。
小结
JavaScript 渲染不是不能用,而是不能只靠它。判断标准很简單:關掉脚本之後,入口頁里還能不能看到目标 URL。如果答案是否定的,那么先补上静態連結,再谈其他優化,顺序會顺很多。