影刀RPA进阶教程:网页滚动加载的4种抓取策略——从暴力滚动到智能增量
现在的网页,十个有八个是滚动加载。
列表页往下滑,新内容自动加载。到不了底部,永远不知道有多少数据。传统"判断下一页按钮"的翻页逻辑完全失效。
这篇文章把滚动加载的 4 种实战策略一次讲透,每种都有适用场景和代码。
一、策略一:暴力计数法——最简单也最笨
思路:滚一次、等加载、抓一次、计数+1。滚到预设次数就停。
滚动次数=0最大滚动次数=20# 预设数据列表=[]条件循环(滚动次数<最大滚动次数):# 等待当前内容加载等待(1.5秒)# 抓取当前屏幕上所有卡片获取相似元素列表("商品卡片")→ 当前卡片列表 遍历列表(当前卡片列表):提取卡片数据(当前卡片,数据列表)# 滚动到底部滚动页面到底部()滚动次数=滚动次数+1优点:简单,不需要判断终止条件。
缺点:滚 20 次但数据只有 5 页就没了——后面 15 次白等白跑。如果有 50 页——只抓到 20 页。
适用场景:内容数量大致已知的场景。比如已知小红书搜索结果最多展示前 200 条,滚 10 次够用了。
二、策略二:增量判断法——推荐首选
店群矩阵自动化突破运营极限!
思路:每次滚动后,对比"这次抓到的卡片数"和"上次抓到的卡片数"。数量不变 → 说明已经到底了 → 退出。
数据列表=[]上次总数=0连续无新增次数=0条件循环(连续无新增次数<2):# 连续2次无新增就退出等待(1.5秒)获取相似元素列表("商品卡片")→ 当前卡片列表 本次新增=len(当前卡片列表)-上次总数 如果 本次新增==0:连续无新增次数=连续无新增次数+1否则:连续无新增次数=0# 只处理新加载的卡片foriinrange(上次总数,len(当前卡片列表)):提取卡片数据(当前卡片列表[i],数据列表)上次总数=len(当前卡片列表)滚动页面到底部()关键设计:不是单次无新增就退出,而是连续 2 次无新增才退出。
为什么?网络波动导致某次加载延迟 3 秒——单次无新增就退出会漏数据。连续 2 次确认,容错率更高。
适用场景:90% 以上的滚动加载网页。这是我最常用的策略。
三、策略三:加载标记法——精准但依赖DOM
思路:很多网页加载完会在底部出现一个"没有更多了"的标记。判断这个标记是否出现。
条件循环(True):等待(1.5秒)获取相似元素列表("商品卡片")→ 当前卡片列表 提取全部数据(当前卡片列表,数据列表)滚动页面到底部()等待(1秒)# 判断是否到底判断元素是否存在("已无更多内容提示",超时=0.5)如果 元素存在:跳出循环小红书、抖音、知乎等平台都会在底部显示"已经到底了"“没有更多内容了”。抓到它就退出。
缺点:每个平台、每个版本DOM可能不同。小红书某次改版把"没有更多了"的 class 名改了——你的流程就永远滚不到头(或者永远不会停)。
稳妥做法:标记法 + 增量法组合。优先判断标记(更精准),标记判断失败时(DOM改了),增量法兜底退出。
条件循环(True):等待(1.5秒)获取相似元素列表("商品卡片")如果len(当前卡片列表)==上次总数:无新增次数+=1否则:无新增次数=0# 标记法优先退出判断元素是否存在("没有更多了",0.5秒)if找到:break# 增量法兜底if无新增次数>=3:break滚动页面到底部()四、策略四:API接口直调——最高效
思路:不滚页面,直接用影刀的"发送HTTP请求"调后端API,拿到 JSON 数据。
很多滚动加载的网页,实际数据来自后端的分页API。
怎么找到API:
- 打开F12 → Network 标签
- 滚一下页面 → 观察新出现的 XHR/Fetch 请求
- 找到返回数据量最大的那个请求
- 看它的 URL 和参数
比如小红书搜索的 API 长这样:
https://edith.xiaohongshu.com/api/sns/web/v1/search/notes? keyword=连衣裙& page=2& page_size=20& sort=general参数里page就是页码。直接发 HTTP 请求拿数据,比模拟滚动快 10 倍。
# 影刀HTTP请求指令forpageinrange(1,50):url=f"https://api.xxx.com/search?keyword=连衣裙&page={page}"发送HTTP请求(GET,url,请求头={"User-Agent":"Mozilla/5.0 ...","Cookie":cookie值})→ 响应数据 解析JSON(响应数据)→ 数据对象# 解析notes列表notes=数据对象["data"]["items"]iflen(notes)==0:break# 无数据,到最后一页fornoteinnotes:标题=note["display_title"]作者=note["user"]["nickname"]# ... 提取数据优点:快、稳定、不受DOM变化影响。
限制:需要能拿到API的认证参数(Cookie 或 Token)。有些平台 API 加了签名校验,参数里有时效性的sign字段,这种就别硬刚 API 了,用增量法更省心。
temu店群自动化报活动案例
五、四种策略选型速查
| 策略 | 适合场景 | 不适合 |
|---|---|---|
| 暴力计数 | 已知总数据量 | 数据量不确定 |
| 增量判断 | 大部分网页,推荐 | 数据去重场景(卡片数据会重复) |
| 加载标记 | 平台有明确"到底"提示 | DOM不稳定的页面 |
| API直调 | 后端接口可直接调用 | 接口有签名校验 |
六、两个通用防坑技巧
1. 数据去重
滚动加载有时会重复加载之前的数据。你按"新卡片"的逻辑抓,结果抓到了一堆重复的。
已采集ID集合=set()数据列表=[]# 在处理每张卡片时卡片ID=获取元素属性(当前卡片,"data-id")if卡片IDnotin已采集ID集合:已采集ID集合.add(卡片ID)提取卡片数据()else:跳过# 重复数据2. 滚动步长精细控制
有时候滚动页面到底部()滚太快了,新内容没触发加载。
# 用JS控制滚动距离执行JavaScript("window.scrollBy(0, 600);")# 每次滚600px# 分阶段滚动foriinrange(5):执行JavaScript(f"window.scrollBy(0, 400);")等待(0.3)分阶段滚动的触发率比一次滚到底高。原理:很多懒加载的触发条件不是"滚动条到底",而是"图片进入视口的一定距离内"。
内容标签:#影刀RPA #滚动加载 #数据采集 #网页自动化 #懒加载
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。