影刀RPA进阶教程_网页动态加载数据抓取策略

影刀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学习手册》系列文章之一,内容源于实操经验的整理与分享。