蜘蛛池的入口站,最终交到蜘蛛手里的其实是一份 HTML 源码。样式、动效、图片这些东西,多数要等 HTML 解析完之后才逐步加载。也就是说,蜘蛛第一次看到页面时,能立刻判断的只有源码本身:体积多大、正文在哪、有多少链接、有没有可读的文字。入口页做得再精致,如果源码这一层是“重”的,抓取效率就会打折。
HTML 体积:多出来的部分都在消耗抓取时间
蜘蛛抓取单次响应是有上限的,各搜索引擎的具体数值不同,但基本以 MB 计,超过部分会被截断。这意味着,一个入口页如果因为内联 base64 图片、大段内联样式、嵌套过深的 DOM 结构,把 HTML 撑到几百 KB 甚至更大,靠后的内容很可能压根没被读到。
更常见的情况不是超限,而是“不值”。蜘蛛的抓取预算是有限的,一份臃肿的 HTML 换来的有效信息如果只有几行文字和一两个链接,性价比就很低。入口页本身不需要承载太多内容,把 HTML 控制在几十 KB 以内,是比较稳妥的做法。
首字节时间:服务器太慢,蜘蛛可能等不到内容
首字节时间(TTFB)指的是从蜘蛛发起请求,到收到服务器第一个字节的间隔。这个值偏高时,蜘蛛在超时之前拿不到东西,这次抓取就白跑了。入口页铺量之后往往共用少数几台服务器,如果数据库查询没做缓存、动态拼接逻辑太重,单页看着没问题,并发一上来 TTFB 就会明显拉高。
对入口页而言,静态化生成是成本最低的解法之一:页面提前生成好,请求进来直接返回文件,TTFB 通常能稳定在很低的水平,也不依赖数据库。
正文和链接的位置,值得往前挪一挪
蜘蛛是自上而下解析 HTML 的。如果正文段落和指向目标页的链接被压到很靠后的位置,前面堆着一大段导航、广告位占位、无关的版权说明,那么被完整读取的概率就会下降。
- 把可读的正文放在源码靠前的位置,哪怕视觉上看起来普通;
- 指向目标页的链接尽量出现在正文附近,而不是全部集中到底部;
- 避免用大量空 div 或重复的容器把真正的内容“埋”起来。
外链资源、JS 渲染与懒加载
JS 渲染
搜索引擎对 JavaScript 的渲染能力在提升,但渲染是要额外排队的,通常比直接抓取 HTML 慢一截,而且不一定每次都会执行。入口页如果正文和链接全部靠 JS 插入,被漏掉的风险就明显高于静态输出。能直接写在 HTML 里的内容,就不要绕道 JS。
懒加载与分页
图片懒加载本身不影响文字抓取,但如果把链接也用“滚动到底部才加载”的方式处理,蜘蛛不滚动,就永远看不到这些链接。分页同理,入口页若靠“加载更多”按钮翻页,而按钮背后是 JS 请求,那么第二页之后的内容对蜘蛛来说基本不存在。需要被发现的链接,最好在源码里就是可点击的 a 标签。
上线前的一份检查清单
- 确认服务器开启了 gzip 或 brotli 压缩,HTML 传输体积会小很多;
- 抽查几个入口页 HTML 的原始体积,重点看有没有内联大图或超长内联样式;
- 用不执行 JS 的方式查看源码,确认正文和通往目标页的链接是否真实存在;
- 测一下 TTFB,尤其是并发下的表现,而不是只看单次访问;
- 检查是否存在必须滚动或点击才会出现的链接;
- 控制单页外链资源的数量,第三方统计、字体、组件脚本不必每个站都堆一遍。
入口页的作用是让蜘蛛顺畅地读到内容、顺着链接走到目标页。页面做得漂亮与否,蜘蛛判断不了;源码是重是轻,它第一时间就能感受到。
把这些基础项理顺之后,再做铺量,抓取效率会稳定很多。反过来,如果入口页一层层往上叠资源,站点数量再多,实际能被读到的有效页面也有限。