抓取从下载开始,体积就是成本
蜘蛛抓一个 URL,第一步是把响应体完整读下来。页面越大,下载耗时越长,占用的连接时间越久。对单个页面来说,几十 KB 和几百 KB 的差别可能只是一次抓取快慢;但放到全站几万、几十万个 URL 上,这个差别会直接体现在单位时间内蜘蛛能走过的页面数量上。
所以页面体积不只是体验问题,它同时决定了蜘蛛一趟能覆盖多少地址。
HTML 是怎么变重的
- 把大段结构化数据、样式、脚本内联进 HTML,而不是放在独立文件里;
- 模板里输出的隐藏区块、弹窗、多套导航,用户看不到但蜘蛛要解析;
- 列表页一次渲染几百条记录,而用户通常只滚动到前几十条;
- 注释、调试代码、重复的 class 名,长期积累下来没人清理。
这些内容多数对蜘蛛理解页面没有帮助,却要被下载、解析,并占用后续处理环节。
DOM 深度与链接可发现性
蜘蛛要从 HTML 里提取链接。链接埋得越深——包在多层嵌套的容器、需要展开的组件、点了才出现的菜单里——被稳定提取的概率就越低。DOM 层级过深还有一个副作用:正文和导航链接混在一起,蜘蛛更难判断哪些链接值得继续跟。
比较稳妥的做法是让主导航、分类入口、面包屑在 HTML 里以朴素形式出现,不依赖交互才加载。
懒加载与依赖 JS 的内容
图片懒加载对抓取影响不大,但把链接或正文放在脚本执行后才插入的组件里,就存在风险。渲染能力是有限的,也不是每一次抓取都会等脚本跑完。内容层面的建议很简单:关键链接和主体文本服务端直出,交互增强放在后面。
服务端能做的几个取舍
- 压缩传输:开启 gzip 或 brotli,能砍掉相当一部分传输体积;
- 列表拆分:限制单页条数,用分页把长列表切开;
- 缓存与响应时间:把渲染结果缓存起来,减少蜘蛛等待;
- 去冗余:定期清理模板里已经没人用的区块和样式。
用日志验证,而不是凭感觉
改动之后,看服务器日志里蜘蛛的来访次数、平均响应时间,以及请求被浪费在参数页或无意义页面上的比例。体积变小、响应变快,通常表现为同一时间段内蜘蛛走过更多 URL。但这不等于一定会收录或带来排名,它只是把抓取这条路修得顺一点。
蜘蛛的时间是有限的。让它少花在下载和解析上,才有机会多走几个页面。