很多站点在浏览器里看着完整,蜘蛛抓到的却是一份缺了几块的 HTML。原因通常不是蜘蛛能力差,而是页面把关键内容交给了脚本,或者藏在需要滚动、点击之后才出现的位置。理解蜘蛛打开页面那一刻看到的东西,能省掉很多无效排查。
蜘蛛先拿到的是原始 HTML,不是渲染后的画面
多数蜘蛛会先取一次原始 HTML,再决定是否投入资源去渲染。渲染要消耗算力,通常有时间预算和排队,页面越重、依赖越多,被跳过的概率就越高。所以判断一个链接能不能被走到、一段文字能不能被读到,最先要看的不是浏览器里的效果,而是查看网页源代码里有没有。
方法很简单:用「查看网页源代码」而不是「检查元素」,在里面搜索关键词。搜得到,说明它在原始 HTML 里;搜不到,它大概率只存在于渲染后的 DOM 中。
三类最常见的「蜘蛛看不见」
图片与延迟加载的模块
常见的懒加载写法把真实地址放在 data-src 一类属性里,src 留空或放占位图。图片本身对抓取影响有限,但如果整个模块的内容也是滚动到视口才通过接口拉取,蜘蛛拿到的就是一个空容器。
滚动到底才出现的列表
「加载更多」如果只是按钮加接口,蜘蛛顺着走一遍往往只拿到第一屏。列表页被截断之后,后面的条目就失去了唯一的内链入口,URL 发现也随之断掉。可用的做法是:保留一组可爬的分页链接,哪怕样式上弱化;或者让后续页面拥有独立的静态地址。
折叠区、标签页与弹窗里的内容
用 CSS 或 display:none 藏起来的内容,多数时候仍会出现在 HTML 里,可以被读到;但如果是点击后才发请求、再把结果插进 DOM,那部分通常读不到。标签页同理,非激活标签若靠接口填充,对蜘蛛来说就只剩一个空壳。
让关键内容留在原始 HTML 里
- 正文和主导航尽量服务端渲染,或在首次返回时就写进 HTML。
- 重要链接用标准 a 标签写出 href,不要只绑 onclick。
- 分页、上一页/下一页保留可爬地址,不用纯按钮替代。
- 懒加载图片保留 src,或提供 noscript 回退。
- 需要渲染的页面,别把唯一入口也放在需要渲染的脚本里。
和抓取路径、内链结构放在一起看
这件事最终影响的是路径。一个 URL 如果只存在于「点击加载更多」之后,它就没有内链指向,蜘蛛只能靠外链或 Sitemap 偶遇。相反,把列表分页写成静态地址,等于给每一页都开了一条稳定的路,抓取路径清楚了,回访也更容易覆盖到更深一层的页面。
日常检查可以按这个顺序走:先用查看源代码确认关键内容在不在;再看列表页的分页链接是不是真实地址;然后翻服务器日志,看蜘蛛是不是只抓了列表第一页;最后核对 Sitemap 里的 URL 是否和页面上可点的链接对得上。对不上的那部分,往往就是需要补链接的地方。
服务器压力大时也不一定要靠渲染来换体验。很多时候把首屏内容做轻、把入口写成链接,反而让蜘蛛和用户都更快到达目标页。