当前位置: 首页 > news >正文

影刀RPA数据采集进阶:分页翻页、懒加载、反爬虫应对全解析

影刀RPA数据采集实战进阶:分页翻页、懒加载、反爬虫应对全解析

作者:林焱|更新时间:2026-06|难度:中级进阶|阅读时间:约16分钟


前言

做数据采集,新手阶段能采集单页数据,进阶阶段要面对这些挑战:

  • 数据有几十页,翻页规律各不相同
  • 页面用了懒加载,不滚动看不到数据
  • 服务器检测出是爬虫,直接封IP
  • 验证码突然弹出来,流程中断

本文专注讲这些实际踩坑场景的解决方案,不说基础,全是干货。


第一章:翻页策略全解析

1.1 翻页类型识别

采集之前,先判断翻页类型:

翻页类型识别方式典型网站
URL参数翻页URL里有?page=1?p=1电商、新闻
按钮翻页有"下一页"按钮或数字页码通用
无限滚动滚动到底部自动加载微博、抖音评论
加载更多点击"加载更多"按钮论坛、部分资讯站
前端路由翻页URL的hash变化(#page2SPA应用

1.2 URL参数翻页(最简单)

采集目标="https://shop.example.com/products?category=digital&page={page}"总页数=50# 先手动确认总页数,或用代码获取遍历1到 总页数aspageNum:# 构造URLurl=采集目标.格式化(page=pageNum)# 打开页面访问URL:url 等待元素出现://div[@id='product-list']超时时间:15# 采集当前页数据[video(video-z4X2ML2s-1782025018282)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限!)]调用子流程:ExtractProducts 输出:pageData# 保存数据如果 pageData 不为空:批量写入Excel:pageData# 友好延迟(防止被封)等待:随机(1000,3000)毫秒# 1-3秒随机等待# 打印进度记录日志:"已完成第 "+pageNum+"/"+总页数+" 页"

动态获取总页数:

访问URL:首页URL 等待页面加载# 方式1:从页码导航获取总页数总页数文本=获取文本://span[@class='total-page']# 文本格式: "共50页" 或 "1/50"总页数=提取数字(总页数文本)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a24e3b55ddd4477d8b4d8beb32453768.png#pic_center)# 方式2:获取页码列表的最后一个所有页码=获取元素列表://ul[@class='pagination']//a[@class='page-num']最后一个=所有页码[-1]总页数=整数(获取文本(最后一个))

1.3 按钮翻页(最通用)

页码=1循环:# 采集当前页调用子流程:ExtractCurrentPage 输出:pageData 记录日志:"第 "+页码+" 页,获取 "+len(pageData)+" 条数据"批量写入Excel:pageData# 检查是否有下一页下一页按钮=检查元素是否存在://a[contains(text(),'下一页')]//button[@aria-label='下一页']//li[@class='next'andnot(contains(@class,'disabled'))]如果 下一页按钮 不存在:记录日志:"已到最后一页,采集完成"跳出循环# 点击下一页点击:下一页按钮# 等待新内容加载# 方法:等待URL变化 或 等待原来的内容消失等待URL变化 或 等待:2000毫秒 等待元素出现://div[@class='product-item']超时时间:15秒 页码+=1等待:随机(800,2000)毫秒

处理页码按钮失效(disabled)的情况:

下一页按钮=找到元素://a[text()='下一页']如果 下一页按钮 存在:按钮class=获取属性:下一页按钮,class如果"disabled"在 按钮class"inactive"在 按钮class:记录日志:"下一页按钮已禁用,到达最后一页"跳出循环 点击:下一页按钮

1.4 无限滚动加载

已采集数量=0上次数量=-1连续无变化次数=0循环:# 滚动到底部,触发加载执行JS:"window.scrollTo(0, document.body.scrollHeight)"等待:2000毫秒# 等待新内容加载# 等待加载指示器消失(如果有)如果 存在(//div[@class='loading-spinner']):等待元素消失://div[@class='loading-spinner']超时时间:10# 统计当前数量当前元素列表=获取元素列表://div[@class='item-card']当前数量=len(当前元素列表)记录日志:"当前已加载 "+当前数量+" 条"# 检查是否不再增加如果 当前数量==上次数量:连续无变化次数+=1如果 连续无变化次数>=3:# 连续3次没变化,认为加载完成记录日志:"加载完成,共 "+当前数量+" 条"跳出循环 否则:连续无变化次数=0上次数量=当前数量# 防止死循环如果 当前数量>10000:# 超过上限就停记录日志:"达到采集上限"跳出循环# 采集所有已加载的数据采集所有可见数据

1.5 "加载更多"按钮

循环:# 检查是否有"加载更多"按钮加载更多按钮存在=检查元素://button[contains(text(),'加载更多')]//a[text()='查看更多']如果 加载更多按钮存在==False:记录日志:"没有更多数据"跳出循环 点击:加载更多按钮# 等待新数据出现当前项目数=len(获取元素列表(//div[@class='item']))等待JS条件:"document.querySelectorAll('.item').length > "+当前项目数 超时时间:10秒 等待:随机(500,1500)毫秒

第二章:反爬虫应对策略

2.1 常见反爬虫检测手段

检测方式原理影响
User-Agent检测检查请求头拒绝非正常UA
请求频率检测访问太快限速或封IP
IP封禁同IP频繁请求直接封锁
Cookie/Session检测缺少正常浏览痕迹返回错误页
JavaScript检测检查浏览器特征验证码或跳转
验证码人机验证流程中断
行为分析鼠标移动、停留时间等标记为机器人

2.2 基础防护:模拟人类行为

# 1. 随机等待(最重要)访问URL 等待:随机(1500,4000)毫秒# 不要固定时间# 2. 随机鼠标移动鼠标移动到随机位置# 模拟人类阅读习惯# 3. 随机滚动执行JS:""" const scrollAmount = Math.floor(Math.random() * 500) + 200; window.scrollBy(0, scrollAmount); """等待:随机(500,1500)毫秒# 4. 设置真实User-Agent设置浏览器UA:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"# 5. 控制采集速度每页采集后等待:随机(2000,5000)毫秒 每10页额外休息:随机(10000,30000)毫秒# 10-30秒

2.3 处理IP封禁:代理IP池

代理IP列表=["http://user:pass@proxy1.example.com:8080","http://user:pass@proxy2.example.com:8080","http://user:pass@proxy3.example.com:8080",]当前代理索引=0请求计数=0每个代理最多请求数=50循环:# 检查是否需要切换代理如果 请求计数>=每个代理最多请求数:当前代理索引=(当前代理索引+1)%len(代理IP列表)请求计数=0记录日志:"切换到代理 "+(当前代理索引+1)# 重新初始化浏览器(使用新代理)关闭当前浏览器 新建浏览器:代理:代理IP列表[当前代理索引]等待:3000毫秒# 正常采集逻辑采集一页数据 请求计数+=1

2.4 检测被封的信号

子流程:CheckIfBlocked# 检查页面标题页面标题=获取页面标题()封锁关键词=["Access Denied","403 Forbidden","Error","验证","安全验证"]遍历 封锁关键词askeyword:如果 keyword 在 页面标题:返回True# 检查页面内容页面内容=获取页面文本()如果"请验证您不是机器人"在 页面内容:返回True如果"您的访问异常"在 页面内容:返回True# 检查目标元素是否存在如果 目标元素不存在(//div[@id='product-list']):返回True返回False# 在主流程中使用访问URL 如果 CheckIfBlocked():记录日志:"检测到IP被封,等待10分钟后重试"等待:600000毫秒# 10分钟切换代理 重新访问URL

2.5 Cloudflare绕过技巧

许多网站用了Cloudflare保护,会有一个5秒等待页面:

访问URL 等待:8000毫秒# 等Cloudflare验证完成# 检查是否还在Cloudflare页面如果"Checking your browser"在 获取页面文本():等待:10000毫秒# 再等10秒# 验证是否进入了目标页面![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cdc2eb92c7b64512b95ca9fdcef4d9e0.png#pic_center)如果 目标元素不存在(//div[@id='main-content']):记录日志:"Cloudflare验证未通过"# 尝试刷新刷新页面 等待:10000毫秒

第三章:懒加载的特殊处理

3.1 图片懒加载

temu店群自动化报活动案例

懒加载的图片URL通常在data-src而不是src

<!-- 未加载状态 --><imgsrc="placeholder.gif"data-src="real_image.jpg"class="lazy"><!-- 加载后变成 --><imgsrc="real_image.jpg"class="lazy loaded">
# 错误做法:获取src属性(得到placeholder)图片URL=获取属性://img[@class='lazy'],src# 正确做法:先滚动到元素可见位置,再获取滚动到元素://img[@class='lazy']等待:500毫秒# 等待懒加载触发![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e4a1b50d10174f23bf3fe7567be941c8.png#pic_center)# 优先取src,如果还是placeholder,取data-src图片URL=获取属性://img[@class='lazy loaded'],src 如果 图片URL 包含"placeholder"或 图片URL 为空:图片URL=获取属性://img[@class='lazy'],data-src

3.2 内容懒加载(滚动可视区触发)

# 分段滚动,确保所有内容都被触发加载页面高度=执行JS:"return document.body.scrollHeight"每段高度=500当前位置=0循环:执行JS:"window.scrollTo(0, "+当前位置+")"等待:300毫秒# 等待这段内容加载当前位置+=每段高度 如果 当前位置>页面高度:跳出循环# 滚回顶部,开始正式采集执行JS:"window.scrollTo(0, 0)"等待:1000毫秒

第四章:采集数据质量保障

4.1 数据验证

子流程:ValidateProductData(product)必填字段=["title","price","url"]遍历 必填字段asfield:如果 field 不在 product 或 product[field]为空:返回False,"缺少字段: "+field# 价格格式验证尝试:price=浮点数(product["price"].替换(",","").替换("¥",""))如果 price<=0或 price>1000000:返回False,"价格异常: "+price 异常:返回False,"价格格式错误"返回True,"OK"

4.2 去重处理

已采集URL=集合()遍历 产品URL列表asurl:如果 url 在 已采集URL:记录日志:"跳过重复URL: "+url 继续# 采集详情详情=采集详情页(url)已采集URL.添加(url)保存(详情)

总结

场景最佳方案
URL参数翻页循环构造URL,范围可知时最高效
按钮翻页检测"下一页"是否存在+是否禁用
无限滚动循环滚动到底部,连续无变化则停止
加载更多按钮点击后等待元素数量增加
反爬虫随机延迟+随机鼠标+代理IP轮换
懒加载图片先滚动到可见区域,再获取src
数据质量验证+去重+断点续采

这些技巧组合使用,能覆盖95%的数据采集场景。


下一篇推荐:《影刀RPA存储方案对比:Excel、SQLite、MySQL怎么选?》

关注作者获取更多影刀RPA实战教程!

http://www.jsqmd.com/news/1056397/

相关文章:

  • 深耕成都黄金回收市场,正规资质门店甄别技巧分享 - 讯息早知道
  • 2026武汉厨卫改造施工哪家靠谱?5家工艺过硬的装修公司实测对比 - 优家闲谈
  • 3步解锁QQ音乐加密文件:qmc-decoder让你的音乐自由播放
  • 从检测到治理,从服务到产品——杭州企民科技有限公司构建室内环境健康产业生态链 - 速递信息
  • RS乘积码子码构造:逼近Singleton界的显式设计与性能分析
  • 嵌入式系统热管理实战:从热阻原理到软硬件协同散热设计
  • Ubuntu 18.04 下部署 Ampache 私有音乐服务器完整指南
  • 江苏登报怎么线上办理?遗失证件登报补办全过程 - 速递信息
  • 谷城办生日宴饭店测评榜:场地、菜品、服务全维度对比 - 速递信息
  • 青岛怎么找靠谱的营业性演出许可证代办机构 - 速递信息
  • 操作系统不是界面,而是数字世界的交通管制员
  • 陇西办生日宴测评榜:本地口碑场地实测与推荐指南 - 速递信息
  • 一个字符串可以是是什么
  • 2026苏州黄金回收品类/需求匹配指南|黄金回收口碑排名前十名推荐 - 天天生活分享日志
  • 探店日记|亲身带 130 克婚嫁金实测郑州鑫奢,和街边小店差距一目了然 - 鑫奢黄金回收
  • MC13224降压稳压器配置与低功耗应用实战指南
  • 考研英语同源阅读60篇|考研英语同源阅读80篇|考研英语同源文章阅读
  • 上海登报怎么线上办理?CN 刊号有效登报须知 - 速递信息
  • 郑州卖黄金 10 大行业骗局深度拆解,实地实测鑫奢完美规避所有陷阱 - 鑫奢黄金回收
  • 为什么APK Installer是Windows上安装Android应用的终极解决方案?
  • CentOS 7 SSH密钥登录全链路配置与排错指南
  • 宿州高三高考失利补救,小班分层教学,针对性攻克单招文化课 - cc江江
  • SCMP证书有效期多久?需要继续教育吗? - 众智商学院课程中心
  • 2026佛山首饰回收分级榜单,6家持证门店权威评级优选 - 讯息早知道
  • 天津登报怎么线上办理?正规报社线上登报渠道详解 - 速递信息
  • Windows触控板革命:3分钟解锁Mac级三指拖拽的终极秘籍
  • JMeter断言全解析:从协议校验到业务验证的自动化测试实践
  • Cyclops:让Kubernetes真正被开发者用起来的DevEx平台
  • UE Viewer:虚幻引擎资源查看与导出的终极解决方案
  • 实验室净化建设包含哪些主要项目--华川洁净 - 华川洁净