蜘蛛抓一个页面通常分两段:先把 HTML 源码拿回去,再把页面放进渲染队列,执行脚本、加载样式和图片。第一段只要服务器正常返回,内容基本就到手了;第二段能还原出什么,取决于这些渲染资源允不允许被抓。
渲染资源本身也是抓取对象
很多站点只盯着 HTML,忽略了 CSS、JS、图片、字体同样是蜘蛛要发起的独立请求。它们被挡住时,后果并不一样:
- CSS 被屏蔽:页面结构还在,但布局信息缺失,判断某段内容是不是正文、是不是隐藏元素会变难,抽取结果的准确度下降。
- JS 被屏蔽:依赖脚本插入的正文、列表、导航可能整块消失,蜘蛛看到的是一张空壳页面。
- 图片被屏蔽:文字内容一般不受影响,但页面完整性受损,图片搜索的收录机会也基本没了。
- 字体、图标被屏蔽:影响较小,但若因此引发大量 403,日志里会混进不少噪音。
三类常见误伤
问题往往不是有意屏蔽,而是配置顺手带出来的。
robots.txt 的通配写法
比如 Disallow: /assets/、Disallow: /*.js$、Disallow: /static/,本意是挡掉后台或临时文件,结果把整站样式和脚本一起挡了。写完规则后,把关键资源路径逐条对着规则走一遍,比事后排查省事得多。
WAF 与 CDN 的静态资源校验
有些防护策略只对静态资源做频率或 UA 校验,正常用户访问没事,蜘蛛密集请求时却被 403。还有一种情况是防盗链:图片校验 Referer,蜘蛛请求不带来源,直接拿不到。日志里通常表现为同一批静态资源反复报错。
懒加载与滚动触发
用 data-src 存放真实地址、再靠脚本替换,或者列表只在滚动到底部时才请求下一页,这些做法在浏览器里体验不错,但蜘蛛未必会滚动、未必会等。首屏内容尽量直接写在 HTML 里,后续内容用可点击的分页链接承载,比押注脚本更稳。
自查顺序
- 关掉 JS 打开页面,看还剩多少可见内容,能对上就说明主要内容不依赖脚本。
- 抓取几个代表页,检查静态资源的返回码,重点看 403、404 和超时。
- 翻服务器日志,看静态资源的抓取量是否异常接近零。正常站点这部分请求量通常远大于 HTML。
- 移动端和桌面端各看一遍,两套 UA 对应的资源加载策略有时并不一致。
渲染资源的请求数量通常远超 HTML 本身,但它真正的价值不在数量,而在于它决定了蜘蛛最终看到的是一个完整页面,还是一张空壳。
把资源体积也纳入考虑
体积越大,单次渲染耗时越长,单位时间里能处理完的页面就越少。合并零碎的小文件、开启压缩、把非关键脚本延后加载,都是常规做法。但要注意别把关键样式也延迟到脚本执行之后,那等于人为制造一次渲染失败。资源优化和抓取效率是同一件事的两面,不必分开看。