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

发布时间:2026/6/21 18:22:38
影刀RPA数据采集进阶:分页翻页、懒加载、反爬虫应对全解析 影刀RPA数据采集实战进阶分页翻页、懒加载、反爬虫应对全解析作者林焱|更新时间2026-06|难度中级进阶|阅读时间约16分钟前言做数据采集新手阶段能采集单页数据进阶阶段要面对这些挑战数据有几十页翻页规律各不相同页面用了懒加载不滚动看不到数据服务器检测出是爬虫直接封IP验证码突然弹出来流程中断本文专注讲这些实际踩坑场景的解决方案不说基础全是干货。第一章翻页策略全解析1.1 翻页类型识别采集之前先判断翻页类型翻页类型识别方式典型网站URL参数翻页URL里有?page1或?p1电商、新闻按钮翻页有下一页按钮或数字页码通用无限滚动滚动到底部自动加载微博、抖音评论加载更多点击加载更多按钮论坛、部分资讯站前端路由翻页URL的hash变化#page2SPA应用1.2 URL参数翻页最简单采集目标https://shop.example.com/products?categorydigitalpage{page}总页数50# 先手动确认总页数或用代码获取遍历1到 总页数aspageNum:# 构造URLurl采集目标.格式化(pagepageNum)# 打开页面访问URL:url 等待元素出现://div[idproduct-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[classtotal-page]# 文本格式: 共50页 或 1/50总页数提取数字(总页数文本)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a24e3b55ddd4477d8b4d8beb32453768.png#pic_center)# 方式2获取页码列表的最后一个所有页码获取元素列表://ul[classpagination]//a[classpage-num]最后一个所有页码[-1]总页数整数(获取文本(最后一个))1.3 按钮翻页最通用页码1循环:# 采集当前页调用子流程:ExtractCurrentPage 输出:pageData 记录日志:第 页码 页获取 len(pageData) 条数据批量写入Excel:pageData# 检查是否有下一页下一页按钮检查元素是否存在://a[contains(text(),下一页)]或//button[aria-label下一页]或//li[classnextandnot(contains(class,disabled))]如果 下一页按钮 不存在:记录日志:已到最后一页采集完成跳出循环# 点击下一页点击:下一页按钮# 等待新内容加载# 方法等待URL变化 或 等待原来的内容消失等待URL变化 或 等待:2000毫秒 等待元素出现://div[classproduct-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[classloading-spinner]):等待元素消失://div[classloading-spinner]超时时间:10秒# 统计当前数量当前元素列表获取元素列表://div[classitem-card]当前数量len(当前元素列表)记录日志:当前已加载 当前数量 条# 检查是否不再增加如果 当前数量上次数量:连续无变化次数1如果 连续无变化次数3:# 连续3次没变化认为加载完成记录日志:加载完成共 当前数量 条跳出循环 否则:连续无变化次数0上次数量当前数量# 防止死循环如果 当前数量10000:# 超过上限就停记录日志:达到采集上限跳出循环# 采集所有已加载的数据采集所有可见数据1.5 加载更多按钮循环:# 检查是否有加载更多按钮加载更多按钮存在检查元素://button[contains(text(),加载更多)]或//a[text()查看更多]如果 加载更多按钮存在False:记录日志:没有更多数据跳出循环 点击:加载更多按钮# 等待新数据出现当前项目数len(获取元素列表(//div[classitem]))等待JS条件:document.querySelectorAll(.item).length 当前项目数 超时时间:10秒 等待:随机(500,1500)毫秒第二章反爬虫应对策略2.1 常见反爬虫检测手段检测方式原理影响User-Agent检测检查请求头拒绝非正常UA请求频率检测访问太快限速或封IPIP封禁同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:passproxy1.example.com:8080,http://user:passproxy2.example.com:8080,http://user:passproxy3.example.com:8080,]当前代理索引0请求计数0每个代理最多请求数50循环:# 检查是否需要切换代理如果 请求计数每个代理最多请求数:当前代理索引(当前代理索引1)%len(代理IP列表)请求计数0记录日志:切换到代理 (当前代理索引1)# 重新初始化浏览器使用新代理关闭当前浏览器 新建浏览器:代理:代理IP列表[当前代理索引]等待:3000毫秒# 正常采集逻辑采集一页数据 请求计数12.4 检测被封的信号子流程:CheckIfBlocked# 检查页面标题页面标题获取页面标题()封锁关键词[Access Denied,403 Forbidden,Error,验证,安全验证]遍历 封锁关键词askeyword:如果 keyword 在 页面标题:返回True# 检查页面内容页面内容获取页面文本()如果请验证您不是机器人在 页面内容:返回True如果您的访问异常在 页面内容:返回True# 检查目标元素是否存在如果 目标元素不存在(//div[idproduct-list]):返回True返回False# 在主流程中使用访问URL 如果 CheckIfBlocked():记录日志:检测到IP被封等待10分钟后重试等待:600000毫秒# 10分钟切换代理 重新访问URL2.5 Cloudflare绕过技巧许多网站用了Cloudflare保护会有一个5秒等待页面访问URL 等待:8000毫秒# 等Cloudflare验证完成# 检查是否还在Cloudflare页面如果Checking your browser在 获取页面文本():等待:10000毫秒# 再等10秒# 验证是否进入了目标页面![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cdc2eb92c7b64512b95ca9fdcef4d9e0.png#pic_center)如果 目标元素不存在(//div[idmain-content]):记录日志:Cloudflare验证未通过# 尝试刷新刷新页面 等待:10000毫秒第三章懒加载的特殊处理3.1 图片懒加载temu店群自动化报活动案例懒加载的图片URL通常在data-src而不是src!-- 未加载状态 --imgsrcplaceholder.gifdata-srcreal_image.jpgclasslazy!-- 加载后变成 --imgsrcreal_image.jpgclasslazy loaded# 错误做法获取src属性得到placeholder图片URL获取属性://img[classlazy],src# 正确做法先滚动到元素可见位置再获取滚动到元素://img[classlazy]等待:500毫秒# 等待懒加载触发![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e4a1b50d10174f23bf3fe7567be941c8.png#pic_center)# 优先取src如果还是placeholder取data-src图片URL获取属性://img[classlazy loaded],src 如果 图片URL 包含placeholder或 图片URL 为空:图片URL获取属性://img[classlazy],data-src3.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].替换(,,).替换(¥,))如果 price0或 price1000000:返回False,价格异常: price 异常:返回False,价格格式错误返回True,OK4.2 去重处理已采集URL集合()遍历 产品URL列表asurl:如果 url 在 已采集URL:记录日志:跳过重复URL: url 继续# 采集详情详情采集详情页(url)已采集URL.添加(url)保存(详情)总结场景最佳方案URL参数翻页循环构造URL范围可知时最高效按钮翻页检测下一页是否存在是否禁用无限滚动循环滚动到底部连续无变化则停止加载更多按钮点击后等待元素数量增加反爬虫随机延迟随机鼠标代理IP轮换懒加载图片先滚动到可见区域再获取src数据质量验证去重断点续采这些技巧组合使用能覆盖95%的数据采集场景。下一篇推荐《影刀RPA存储方案对比Excel、SQLite、MySQL怎么选》关注作者获取更多影刀RPA实战教程