大多数关于抓取的讨论都集中在 HTML 上:链接写在哪、层级有多深、代码是不是服务端输出。但蜘蛛实际工作时,除了下载 HTML,还可能去请求页面里引用的 CSS、JavaScript、图片和字体文件。这些资源不参与内容索引,却会占用抓取请求、影响渲染结果,甚至在服务器吃紧时把一次抓取拖成超时。
蜘蛛为什么还会请求页面资源
纯文本抓取只需要 HTML,用来提取正文和链接。但当搜索引擎需要对页面做渲染时,它会像浏览器一样加载关键资源,尤其是 JS 文件,然后把渲染后的 DOM 拿来提取链接和内容。这意味着一个页面被请求一次,并不等于只消耗一次服务端请求。
所以资源层出问题,不一定让页面从索引里消失,但可能让蜘蛛看到一份不完整的页面:导航没渲染出来、列表是空的、分页链接不见踪影。对依赖前端渲染的站点来说,这一层值得单独检查。
资源层最常见的三类问题
robots.txt 误拦静态目录
有些站点为了防止图片被盗或降低负载,会在 robots.txt 里写 Disallow: /static/,或者整目录屏蔽 JS、CSS。这样蜘蛛确实拿不到资源,渲染出来的页面就可能缺链接、缺内容。屏蔽静态资源要分清目的:如果只是不想让图片出现在图片搜索里,可以用 noindex 或针对具体路径处理,而不是连带把渲染所需的脚本一起挡掉。
资源超时与服务器并发
蜘蛛请求资源同样受超时限制。当同一个页面要拉几十个脚本、样式和小图,而服务器响应又慢,抓取时间会明显拉长,蜘蛛可能在资源没加载完时就放弃渲染。CDN 回源慢、合并文件缺失、大量未压缩的图片,都会加剧这种情况。合并和压缩资源、给静态文件设置长缓存,既能减轻用户端压力,也间接改善了蜘蛛的渲染成功率。
CDN 或安全防护把蜘蛛拦在门外
部分站点启用了较严格的防火墙策略,蜘蛛请求静态资源时被判定为异常流量,返回验证页或直接断开。表现是 HTML 抓取正常,但资源请求大量 403、429 或超时。这种情况最容易被忽略,因为在浏览器里访问一切正常。
资源加载失败会不会影响链接发现
要分两种情况看:
- 链接写在 HTML 里:蜘蛛下载 HTML 就能拿到,资源挂了也不影响这部分 URL 的发现。
- 链接靠 JS 生成:脚本没加载或执行失败,链接就不会出现在 DOM 里,蜘蛛自然也走不到下一页。
换句话说,链接发现是否依赖资源,取决于链接是写在源码里还是运行时生成的。判断方法很简单:关掉 JavaScript 看看导航和列表里还有没有可点的链接。如果全都没了,那这些路径的稳定性就绑在资源层上。
排查思路
- 在服务器日志里按蜘蛛 UA 过滤静态资源路径,看它们的状态码分布,重点看 4xx、5xx 和响应时间。
- 确认 robots.txt 没有误拦渲染所需的 JS、CSS 目录。
- 用抓取测试工具对比关闭与开启 JS 时页面里链接数量的差异。
- 抽查慢页面,看看是不是单个资源拖了几秒。
- 检查 CDN 日志里有没有针对蜘蛛的拦截规则或限速命中。
处理建议
- 关键导航和列表链接尽量保留在 HTML 里,作为 JS 渲染失败时的兜底。
- 静态资源统一走 CDN,设置合理的缓存头,减少回源压力。
- 把拦截规则和蜘蛛白名单一起复核,避免误伤。
- 资源体积做压缩,减少单页请求数量。
- 如果站点仍在使用 Sitemap,不要因为“链接反正能渲染出来”就放弃提交,两者是互补的。
资源不是索引的主体,但它决定了蜘蛛能不能看到完整的页面。把资源层的错误和超时当成抓取问题的一部分来看,通常比只盯 HTML 更接近真实情况。
最后提醒一点:资源层的调整往往不会立刻体现在抓取数据上,观察周期以周为单位比较合理。记录改动前后的日志对比,比凭感觉判断更可靠。