影刀RPA 网页翻页全攻略:页码与加载更多
影刀RPA 网页翻页全攻略页码与加载更多作者林焱什么情况用什么采集列表数据时一页只有20条总共几百上千条需要翻页。不同网站的翻页方式不同——有传统的页码点击翻页、有加载更多按钮、有无限滚动。在影刀RPA里需要根据不同翻页方式选择对应策略并且要正确判断什么时候该停止。适用场景电商商品列表翻页采集、新闻列表分页采集、搜索结果分页采集、任何需要翻页的列表数据采集。怎么做方式一页码翻页拼多多店群自动化报活动上架【打开网页】→ 第1页URL 【循环】 【提取数据】→ 当前页数据 【判断元素是否存在】→ 下一页按钮 存在 → 【点击元素】下一页 → 【等待页面加载】 不存在 → 【退出循环】影刀RPA中的操作# 用影刀可视化指令的伪流程# 1. 【打开网页】 https://example.com/list?page1# 2. 【循环】while True# 3. 【提取相似元素数据】→ 当前页列表数据# 4. 【判断元素是否存在】→ .next-page:not(.disabled)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8feb5ced37e04304af10dc9bb3e2287b.png#pic_center)# 5. True → 【点击元素】→ .next-page# 6. False → break# 7. 【等待元素出现】→ .list-item 确保新页加载完用Python实现importrequestsfrombs4importBeautifulSoupimporttimedefscrape_with_pagination(base_url,max_pages50):页码翻页采集all_data[]forpageinrange(1,max_pages1):urlf{base_url}?page{page}responserequests.get(url,headersheaders,timeout10)soupBeautifulSoup(response.text,html.parser)# 提取当前页数据itemssoup.select(.list-item)ifnotitems:print(f第{page}页无数据停止)breakforiteminitems:data{标题:safe_text(item.select_one(.title)),价格:safe_text(item.select_one(.price)),}all_data.append(data)print(f第{page}页{len(items)}条累计{len(all_data)}条)# 检查是否有下一页next_btnsoup.select_one(.next-page:not(.disabled))ifnotnext_btn:print(没有下一页停止)breaktime.sleep(1)returnall_data方式二加载更多按钮defscrape_with_load_more(url,max_clicks50):加载更多按钮翻页# 在影刀中需要用浏览器自动化# 因为加载更多是JS动态追加内容all_data[]forclick_countinrange(max_clicks):# 1. 提取当前页面数据# 影刀指令【提取相似元素数据】current_dataextract_current_page_data()all_data.extend(current_data)# 2. 查找加载更多按钮# 影刀指令【判断元素是否存在】load_morecheck_element_exists(.load-more-btn)ifnotload_more:print(f第{click_count1}次无加载更多按钮停止)break![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1db4d35a6247424fa3db2ea544f29974.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7e3d8bf5b58449859fe3266fe68bb633.png#pic_center)# 3. 点击加载更多# 影刀指令【点击元素】→ .load-more-btnclick_element(.load-more-btn)# 4. 等待新内容加载# 影刀指令【等待元素出现】→ .list-item:last-childtime.sleep(2)# 5. 检查是否有新数据new_dataextract_current_page_data()iflen(new_data)len(all_data):print(f第{click_count1}次无新数据停止)breakprint(f第{click_count1}次点击累计{len(all_data)}条)returnall_data方式三无限滚动defscrape_infinite_scroll(url,max_scrolls100):无限滚动采集all_data[]last_count0no_change_count0forscroll_numinrange(max_scrolls):# 1. 滚动到底部# 影刀指令【执行JavaScript代码】js_scrollwindow.scrollTo(0, document.body.scrollHeight);execute_js(js_scroll)# 2. 等待加载time.sleep(2)# 3. 提取当前数据current_dataextract_current_page_data()all_datacurrent_data# 页面上所有数据# 4. 检查是否有新数据iflen(all_data)last_count:no_change_count1ifno_change_count3:print(f连续3次无新数据停止)breakelse:no_change_count0last_countlen(all_data)print(f第{scroll_num1}次滚动共{len(all_data)}条)returnall_data通用翻页框架importpandasaspdimporttimeimportrandomclassWebScraper:通用翻页采集框架def__init__(self,namescraper):self.namename self.all_data[]self.output_fileNonedefscrape_page(self,page_num):采集单页子类实现raiseNotImplementedErrordefhas_next_page(self,page_num):判断是否有下一页子类实现raiseNotImplementedErrordefrun(self,max_pages50,delay_range(1,3),output_fileNone):执行采集self.output_fileoutput_fileforpageinrange(1,max_pages1):try:dataself.scrape_page(page)ifnotdata:print(f[{self.name}] 第{page}页无数据停止)breakself.all_data.extend(data)print(f[{self.name}] 第{page}页:{len(data)}条, 累计{len(self.all_data)}条)# 定期保存ifoutput_fileandpage%50:self.save(output_file)ifnotself.has_next_page(page):print(f[{self.name}] 没有下一页停止)break# 随机延迟delayrandom.uniform(*delay_range)time.sleep(delay)exceptExceptionase:print(f[{self.name}] 第{page}页出错:{e})# 出错后等待更久time.sleep(5)continueifoutput_file:self.save(output_file)returnself.all_datadefsave(self,filepath):保存数据dfpd.DataFrame(self.all_data)df.to_excel(filepath,indexFalse)print(f[{self.name}] 已保存{len(df)}条到{filepath})# 使用示例classProductScraper(WebScraper):def__init__(self,base_url):super().__init__(ProductScraper)self.base_urlbase_url self.headers{User-Agent:Mozilla/5.0...}defscrape_page(self,page_num):urlf{self.base_url}?page{page_num}responserequests.get(url,headersself.headers,timeout10)soupBeautifulSoup(response.text,html.parser)itemssoup.select(.product-item)return[{标题:safe_text(i.select_one(.title)),价格:safe_text(i.select_one(.price))}foriinitems]defhas_next_page(self,page_num):urlf{self.base_url}?page{page_num1}responserequests.get(url,headersself.headers,timeout10)soupBeautifulSoup(response.text,html.parser)returnbool(soup.select(.product-item))# 使用scraperProductScraper(https://example.com/products)scraper.run(max_pages20,output_filerC:\Data\products.xlsx)有什么坑坑1翻页后数据重复TEMU店群矩阵自动化运营核价报活动点击下一页后URL变了但页面内容没刷新导致采集到重复数据# 解决等待URL变化等待新内容出现# 影刀中# 【点击元素】下一页# 【等待URL变化】→ 等待URL包含?page2# 【等待元素出现】→ .list-item# 【等待】1秒额外等待渲染# 或者用数据去重seen_idsset()foritemindata:item_iditem.get(ID)ifitem_idanditem_idinseen_ids:continueseen_ids.add(item_id)all_data.append(item)坑2下一页按钮disabled状态判断错误# 问题下一页按钮一直存在但最后一页时class变成disabled# 如果只判断按钮是否存在永远不停# 错误ifsoup.select_one(.next-page):# 一直为Truecontinue# 死循环# 正确检查disabled状态next_btnsoup.select_one(.next-page:not(.disabled))![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/efae03f6ba334421ad1c9f00afa9ecbb.png#pic_center)# 或next_btnsoup.select_one(.next-page)ifnext_btnanddisablednotinnext_btn.get(class,[]):continueelse:break坑3AJAX翻页URL不变有些网站翻页不改变URL只是JS动态加载# 解决找到AJAX接口# F12 → Network → 点击下一页 → 找到XHR请求# 直接请求APIapi_urlfhttps://example.com/api/list?page{page}size20responserequests.get(api_url,headersheaders)dataresponse.json()itemsdata.get(data,data.get(list,[]))坑4翻页速度太快被限制# 解决随机延迟 模拟人类行为importrandom# 随机1-3秒延迟delayrandom.uniform(1,3)time.sleep(delay)# 偶尔长暂停模拟人离开ifrandom.random()0.1:# 10%概率long_pauserandom.uniform(5,10)print(f模拟休息{long_pause:.1f}秒...)time.sleep(long_pause)坑5总页数未知导致无法预估进度# 解决先查看是否有总页数信息total_pagessoup.select_one(.total-pages)iftotal_pages:totalint(total_pages.get_text(stripTrue))print(f总共{total}页)else:print(总页数未知将持续采集直到无数据)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/437b165dbeab424e89e54740e15e7024.png#pic_center)# 或者先快速请求最后一页# 很多网站URL支持?page99999自动跳转到最后一页test_urlf{base_url}?page99999responserequests.get(test_url)# 从返回的URL或页面中获取真实总页数

相关新闻

Workflow 与 Agent 到底有什么区别?—— 从流水线到智能体的全面解析

Workflow 与 Agent 到底有什么区别?—— 从流水线到智能体的全面解析

文章目录一、从一个 Chain 说起二、AI Workflow 工作流:确定性执行的"智能流水线"2.1 什么是 Workflow?2.2 Coze 可视化工作流:拖拽式 AI 编排2.3 Workflow 的三大特征2.4 LangChain:Workflow 的开发框架三、举例&#…

2026/10/11 1:53:57 阅读更多 →
容器逃逸实战:从Docker突破到K8s集群控制的完整攻击链

容器逃逸实战:从Docker突破到K8s集群控制的完整攻击链

"容器不是牢笼。"这句话在安全圈流传已久,但直到你亲手从一个容器里逃出来,才真正理解它的含义。本文完整复盘一次从容器内权限到宿主机Root的逃逸之旅。前言在云原生时代,容器安全已成为企业安全体系的最后一道防线。很多人认为&q…

2026/10/10 14:25:19 阅读更多 →
威胁狩猎实战:如何在茫茫日志中找到那只“隐蔽的熊“

威胁狩猎实战:如何在茫茫日志中找到那只“隐蔽的熊“

"如果你等到告警才行动,你已经慢了。"——威胁狩猎的核心,不是更快地响应告警,而是在告警产生之前,就发现攻击者的踪迹。前言传统安全防御是"被动响应"的:攻击者入侵 → 触发告警 → 安全团队响应…

2026/9/28 2:23:52 阅读更多 →

最新新闻

手机怎么控制电脑远程办公 手机控制电脑的远程软件

手机怎么控制电脑远程办公 手机控制电脑的远程软件

手机怎么控制电脑远程办公?外出出差、居家休整时突发工作需求,电脑不在身边就容易耽误工作进度,多数远控工具体验差、不适配办公场景。手机怎么控制电脑远程办公更方便?建议使用无界趣连2.0,操作简单、实用性强&#x…

2026/10/11 1:53:42 阅读更多 →
手机怎么连接电脑用电脑操作 手机怎样连接电脑

手机怎么连接电脑用电脑操作 手机怎样连接电脑

手机怎么连接电脑用电脑操作?很多用户想在大屏上处理手机应用,或者远程帮家人操作手机,却不知道具体方法。其实选对远程控制工具即可,无界趣连2.0连接简单、延迟低、画质清晰,能轻松实现手机与电脑互控。综合来看&…

2026/10/11 1:53:42 阅读更多 →
242页PPT,战略落地难?真正缺的不是规划,而是从愿景到行动的闭环

242页PPT,战略落地难?真正缺的不是规划,而是从愿景到行动的闭环

很多企业并不缺战略。缺的是战略落地。每年战略会开得很热闹,愿景很宏大,目标很振奋,口号也很有力量。可到了第二季度,业务还是按老办法跑,部门还是按旧边界协同,绩效还是考原来的指标,一线员工…

2026/10/11 1:53:42 阅读更多 →
WPF嵌入D3D11渲染:共享纹理与D3DImage桥接实践

WPF嵌入D3D11渲染:共享纹理与D3DImage桥接实践

简介:一份面向WPF开发者的D3D视频渲染示例,演示在Windows Presentation Foundation中借助Direct3D硬件加速,高效处理并显示YUV颜色空间的视频帧。项目核心提供完整的C#源代码,涵盖YUV数据到D3D纹理的转换、渲染源封装、Win32互操作…

2026/10/11 1:53:42 阅读更多 →
Windows下ffmpeg下载安装与配置避坑指南

Windows下ffmpeg下载安装与配置避坑指南

简介:Windows 版 FFmpeg 最新静态构建压缩包,内置 FFmpeg 4.3.1 的 64 位可执行程序,专为需要批量转码、音视频剪辑、流媒体推送及格式分析的开发者和内容创作者准备,特别适合不愿自行编译源码、希望直接解压使用的 Windows 用户。…

2026/10/11 1:53:42 阅读更多 →
基于 Raft 协议的强一致分布式锁选型:Etcd vs Redis 在金融级场景下的对比

基于 Raft 协议的强一致分布式锁选型:Etcd vs Redis 在金融级场景下的对比

在分布式锁的选型会议上,架构师们经常会面对两派激烈的技术争吵: 一派是“性能实用主义者”,他们力挺 Redis:“Redisson 封装完备,单机吞吐破 10 万 QPS,看门狗自动续期极其优雅,全网普及度最高…

2026/10/11 1:52:42 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →