先明确一点:蜘蛛抓取页面时通常存在一个读取上限,但这个上限各家搜索引擎都没有公开标准,也会随页面类型和时间调整。它不是一条可以卡着算的红线,而是一种倾向——页面越臃肿,读到后面内容的概率越低,解析出来的链接和正文也越容易打折扣。
为什么会有“读不完”这回事
抓取是有成本的。搜索引擎每天要处理海量 URL,每个页面能分配到的下载量、解析量和存储量都有限。当 HTML 体积超出一定范围,抓取程序可能只保留前面一部分字节,后面的内容不再进入解析流程。这不等于判定页面有问题,只是后面的内容没被“看到”。
更常见的情况是没被硬截断,但被稀释:正文埋在几万行 DOM 里,链接藏在底部大段脚本后面,蜘蛛虽然下载完了,解析时有效内容已经被摊薄。
哪些东西最容易把页面撑大
内联脚本与样式
把整个前端框架、埋点代码、样式表直接写进 HTML,是体积膨胀最快的方式。这些东西对蜘蛛发现链接和读取正文几乎没有帮助,却占掉了最前面的字节。
冗余的 DOM 与属性
层层包裹的容器、大量只用于样式控制的 class、重复的 data 属性,会让 DOM 节点数迅速上升。节点太多时,解析成本和内存占用都会增加,链接所在的上下文也变得更难判断。
内联图片与数据块
base64 图片、内联 JSON、把整个列表塞进初始 state,这些内容动辄几十上百 KB,对蜘蛛来说基本是噪声。
页面被“读不完”时会有哪些表现
- 页脚、分页、相关推荐里的链接长期不被抓取;
- 日志里抓取响应正常,但解析出的链接数明显少于实际存在的数量;
- 正文靠后的段落、表格后面的部分没有被正确理解;
- 同一模板的页面抓取表现差异很大,往往是某个页面多了内联数据。
这些现象也可能由其他原因造成,不能只凭体积下结论,要结合抓取日志和内链结构一起看。
给页面瘦身的几个方向
- 把重要内容放前面。标题、正文主体、主要导航链接尽量出现在 HTML 前部,把统计脚本、客服组件、推荐模块往后放。
- 外链化脚本与样式。能拆成独立文件的就拆走,让 HTML 只保留结构。
- 控制 DOM 层级。减少无意义的嵌套容器,清理只服务于旧样式的包装节点。
- 图片用真实地址。除极少数图标外,不要 base64 内联;初始数据用接口按需加载,而不是全部写进 HTML。
- 长内容适当分节或分页。超长列表、超长文档可以拆成多页,并保证分页链接可被抓取到。
- 开启压缩传输。gzip 或 brotli 能明显降低下载体积,对抓取节奏有实际帮助。
别为了瘦身把内容砍掉
体积是参考指标,不是优化目标。为了减字节而删掉正文、隐藏链接、把内容改成图片,只会让页面更难被理解。
真正要控制的是无效字节的比例:脚本、样式、内联数据、重复结构占了多少,有效正文和链接又占了多少。判断标准可以很朴素——如果一个用户禁用脚本打开页面,还能看到主体内容和主要链接,那这个页面大致是稳的。
实际操作顺序
先挑一个典型模板页,用浏览器查看源码,看正文第一条有效链接出现在第几屏、整个 HTML 有多大、DOM 节点有多少。再对照抓取日志,看这个模板下的链接抓取率和其他模板差多少。找出最胖的几个模板先改,改完观察一两周日志变化,再决定要不要继续调整。整个过程不用追求某个具体数字,只要让关键内容尽量靠前、让噪声尽量靠后,页面被完整读取的概率就会提高。