不少人搭好入口页后检查一遍:浏览器打开,目标 URL 的链接一条不少、点着都能跳。可抓取日志里始终没有蜘蛛来过的痕迹。问题往往不在蜘蛛池本身,而在于这些链接是用 JavaScript 在客户端拼出来的——搜索引擎爬虫第一次拿到的,通常是没有执行脚本的原始 HTML。
蜘蛛拿到的第一份内容是什么
主流搜索引擎的抓取流程大致分两步:先请求并保存服务端返回的原始 HTML,把其中的 URL 放进待抓取队列;至于脚本执行和页面渲染,属于后续按需处理,成本更高、排队更久。对入口页这种纯链接集合的页面来说,如果原始 HTML 里一条 href 都没有,URL 发现这一步实际上就没有发生。
常见的高风险写法包括:
- 源码里只有 script 标签和一个空的容器 div,链接全靠前端框架渲染
- 用点击事件绑定跳转,a 标签没有 href,或者写成 href="javascript:void(0)"
- 链接地址存在接口返回的 JSON 里,页面加载后再异步插入
- 依赖懒加载,链接要滚动到可视区域才生成
JS 渲染不是完全没机会,但不该当成主路径
具备渲染能力的搜索引擎确实有机会执行脚本、读到渲染后的链接。但这里有前提:渲染服务要有额度、页面要在超时时间内加载完、脚本和样式文件不能被 robots.txt 拦掉。任何一环出问题,链接就等于不存在。
比较常见的失败环节
- robots.txt 屏蔽了 js 或 css 目录,渲染出来的 DOM 不完整
- 脚本依赖境外 CDN,抓取节点加载超时
- 渲染队列积压,入口页这类低优先级页面被排到很后面
- 页面在无头环境中报错,接口请求被风控拦截
渲染是一项有成本、有条件的能力,不是默认承诺。把 URL 发现全押在它身上,等于把结果交给别人当天的负载情况。
更稳的做法:让链接出现在原始 HTML 里
- 改成服务端输出。入口页用后端模板或静态生成,链接在返回 HTML 时就写进 a 标签,不依赖任何脚本。
- 保持最朴素的链接结构。一个 a 标签、一个可访问的 href,不加 onclick、不套多层容器。相对路径和绝对路径都可以,关键是链接真实存在。
- 保留一条 sitemap 通道。sitemap 和入口页链接是两条并行的 URL 发现路径,互为补充,不要只留一条。
- 不要为了保险而堆砌。入口页动辄几千条链接反而会分散抓取,控制数量、保证每条都能正常打开更有意义。
怎么判断自己的入口页有没有这个问题
最直接的办法是用 curl 之类的工具拉一次源码,搜索 href 看链接是否出现在原始响应里。如果源码里干干净净、只有脚本,那就基本可以确认。也可以借助搜索资源平台的抓取测试工具查看返回的 HTML,或者检查访问日志里有没有对 js、css 文件的请求记录——如果连这些资源都没被请求过,说明渲染大概率没发生。
几个容易忽略的细节
- 链接被 JS 写进 DOM 之后,还要看是否存在 href 属性,纯文本或 data 属性不算链接
- 入口页如果做了移动端适配,注意两套 DOM 输出的链接是否一致
- 改动后给一点时间再观察日志,抓取行为的反馈通常不是即时的
总结起来一句话:蜘蛛池能起作用的前提,是目标 URL 真正出现在蜘蛛能直接拿到的 HTML 里。把链接从脚本里搬回源码,是投入产出比最高的一步排查。