这类问题我又碰上了一次。列表页改成了无限滚动,同时又保留了底部的分页按钮做兜底。结果同一批商品既有 /list?page=2 这样的分页地址,又有滚动加载动态插入的内容,蜘蛛抓到的页面条数和用户看到的完全不一致。

第一反应是「滚动触发依赖 IntersectionObserver 蜘蛛不会执行」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。滚动加载的内容没有对应的独立地址 蜘蛛只能看到首屏;分页按钮指向的地址渲染的是另一套数据 顺序也不一致;页面在滚动后修改了 URL 但没有产生可抓取的新地址。

动手时先对比首屏与分页地址的条目差异

curl -s 'https://www.example.com/list?page=2' | grep -c 'class="item"'

给滚动加载的每一段生成可访问地址

history.pushState({}, '', '/list?page=' + next);

然后在首屏底部输出分页链接供蜘蛛跟随

<a href="/list?page=2" rel="next">下一页</a>

剩下的就是核对分页地址与滚动内容是否同源

curl -s 'https://www.example.com/list?page=2' | md5sum

改完先别撤,确认这几项。统一数据源并补上可抓取的分页链接后,蜘蛛抓到的条数与用户看到的一致,列表页的收录在两周内翻了一倍。

这里还有个坑。无限滚动本身不可抓取,必须有一份等价的分页地址兜底,两套内容如果不同源,蜘蛛拿到的就是残缺版本。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189