把入口页做成单页应用,用 JavaScript 在浏览器里动态拼出目标 URL 的链接,是不少蜘蛛池的常见做法。好处是灵活、方便换链接,问题在于:不同搜索蜘蛛的渲染能力差异很大,能不能发现这些链接,取决于它是否愿意执行你的脚本、执行到什么程度,以及脚本本身会不会被拦住。
抓取和渲染,是两步不是一步
搜索蜘蛛处理一个页面大致分两步:先取原始 HTML,再决定要不要渲染。渲染并不是所有蜘蛛都会做,也不一定每次访问都做。有的蜘蛛只拿 HTML 源码,源码里没有链接,它就认为这个页面没有可跟随的 URL,直接结束这一轮。所以完全依赖 JS 输出链接,等于把发现目标 URL 的主动权交了出去。
三种常见写法,风险依次升高
链接直接写在 HTML 里
最稳。源码里就是完整的 a 标签,对方渲不渲染都能解析出目标 URL。这是推荐做法,也是判断其他方案好坏时的基准线。
用 JS 拼接后插入 DOM
源码里通常只有一个空容器或一段脚本。支持渲染的蜘蛛有机会拿到链接,不支持的拿不到。而且渲染有时间预算,脚本依赖的接口慢一点或者报错,就可能什么都渲染不出来,白跑一趟。
需要交互才出现
点击按钮、滚动到底部、切换标签页之后才加载链接。这种写法对蜘蛛最不友好,绝大多数情况下这些动作不会被触发,链接也就无从发现。
- 源码里就有链接:被发现几乎没有悬念。
- 渲染之后才有链接:可能被发现,也可能不会,取决于对方这次是否渲染。
- 交互之后才有链接:基本不会被发现。
先自查:源码里到底有没有链接
- 用浏览器的“查看网页源代码”打开入口页,注意不是开发者工具里的元素面板。
- 在源码里搜索目标域名或路径关键词。搜得到,说明链接是硬编码的;搜不到,说明依赖渲染。
- 用抓取工具发一次只取 HTML、不执行脚本的请求,对比返回内容和浏览器看到的是否一致。
- 在浏览器里禁用 JavaScript 后刷新页面,看还能不能看到目标链接。
如果第二步就搜不到,那这批目标 URL 的发现效率基本靠运气,后续再怎么优化入口页的排版和更新频率,作用也有限。
一定要用 JS 的话,可以多做这几件事
- 首屏放一批硬编码链接,把重点目标 URL 写进 HTML,动态部分只做补充。
- 把动态内容改成服务端渲染或预渲染,让返回的 HTML 里就带 a 标签。
- 渲染所依赖的接口要快且稳定,别让页面在超时前什么都没输出。
- 关键链接不要放在需要点击、滚动或登录才出现的位置。
- 保留一份纯文本形式的 URL 作为兜底,至少给对方一个可解析的字符串。
渲染支持是加分项,不是保底项。把发现目标 URL 的希望全押在对方的渲染能力上,等于把最可控的环节主动放弃。
小结
JavaScript 渲染不是不能用,而是不能只靠它。判断标准很简单:关掉脚本之后,入口页里还能不能看到目标 URL。如果答案是否定的,那么先补上静态链接,再谈其他优化,顺序会顺很多。