影刀RPA进阶教程_网页动态加载数据抓取策略
影刀RPA进阶教程:网页动态加载数据的抓取策略——Ajax、懒加载与无限滚动
有些网页的商品列表不是一次全部加载的,你滚动到底部,它才去请求服务器加载更多。
你的自动化流程只取了第一屏的数据,页面其实有十几屏,但你没抓到。因为"标准流程"不知道页面是"懒加载"的。
一、先判断页面用的是哪种加载方式
| 加载方式 | 特征 | 检测方法 |
|---|---|---|
| 传统分页 | 页面底部有"1 2 3 … 下一页" | 直接看页面 |
| 无限滚动 | 滚到底自动加载更多,没有分页器 | 滚到底,看页面高度是否变长 |
| 点击"加载更多" | 有个"查看更多"按钮 | 查页面有无这个按钮 |
| Ajax动态刷新 | 点筛选条件后局部刷新,不整页跳转 | 看URL变不变 |
二、无限滚动的处理(最常见)
小红书、抖音、微博等平台都用这种。
店群矩阵自动化突破运营极限!
核心思路
不用做翻页。改滚动。
# 方案1:用JS滚动上次高度=0当前高度=获取当前页面高度()采集数据=[]最大滚动次数=50# 防无限循环滚动次数=0条件循环(当前高度>上次高度 且 滚动次数<最大滚动次数):上次高度=当前高度# 滚动到页面底部Python代码:driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 等待新数据加载固定等待(2秒)# 把当前页面的商品都取了获取相似元素列表("商品卡片")->新卡片 遍历列表(新卡片,卡片):数据=提取商品信息(卡片)如果 数据 不在 采集数据 中:# 去重采集数据.append(数据)输出日志(f"已采集{len(采集数据)}条")# 更新高度当前高度=获取当前页面高度()滚动次数+=1关键:用"页面高度是否还在增加"作为是否滚到底的判断。高度不增加了,说明数据加载完了。
三、"点击加载更多"的处理
比无限滚动简单:
加载次数=0最大加载=30条件循环(True):判断元素是否存在("加载更多按钮")->有按钮 如果不满足 有按钮:输出日志("没有更多了")跳出循环 如果 加载次数>=最大加载:输出日志("达到最大加载次数")跳出循环 点击元素("加载更多按钮")固定等待(3秒)# 等新数据加载加载次数+=1四、Ajax请求拦截(进阶方案)
有些页面滚动后会发Ajax请求获取JSON数据。直接拦截这个JSON,比解析HTML高效得多。
在浏览器里查看Ajax请求
F12 → Network → XHR标签 → 滚动页面 → 看哪些请求返回了数据。
很多接口会直接返回结构化的JSON:
{"code":0,"data":{"items":[{"id":"123","title":"商品A","price":128},...],"hasMore":true,"nextCursor":"abc123"}}在影刀里模拟Ajax请求
拿到接口URL后,直接在影刀里发HTTP请求:
temu店群自动化报活动案例
# 不需要滚动页面!直接调接口cursor=""has_more=True采集数据=[]条件循环(has_more):URL=f"https://api.example.com/feed?cursor={cursor}&count=50"HTTP请求(GET,URL)->响应 data=响应.json()items=data["data"]["items"]采集数据.extend(items)has_more=data["data"]["hasMore"]cursor=data["data"]["nextCursor"]输出日志(f"已采集{len(采集数据)}条")固定等待(1秒)# 接口调用间隔这样比页面滚动快得多,而且不需要和DOM打交道。
五、动态筛选的处理
有些店铺后台的筛选条件点完后数据是Ajax刷新的,URL不变。
# 选择筛选条件点击元素("日期筛选_今天")# 不要等页面跳转,等数据区域刷新# 因为URL不变,不能用"等待元素出现"(元素本来就在)# 用JS监听DOM变化Python代码:fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.common.byimportBy# 等表格行变化old_rows=len(driver.find_elements(By.CSS_SELECTOR,".table-row"))# 等新行出现WebDriverWait(driver,10).until(lambdad:len(d.find_elements(By.CSS_SELECTOR,".table-row"))!=old_rows)六、通用适配策略
defsmart_collection():"""自动判断页面类型并采取对应的采集策略"""# 检测1:有分页按钮吗?如果 元素存在("页码器"):使用分页模式采集()# 检测2:有"加载更多"按钮吗?否则如果 元素存在("加载更多按钮"):使用点击加载模式()# 检测3:滚动后页面高度变化吗?否则:使用无限滚动采集()你的采集流程不需要预先知道页面是什么类型,让它自己判断。
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
