影刀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/7/23 0:30:34 阅读更多 →
容器逃逸实战:从Docker突破到K8s集群控制的完整攻击链

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

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

2026/7/23 0:28:33 阅读更多 →
威胁狩猎实战:如何在茫茫日志中找到那只“隐蔽的熊“

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

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

2026/7/23 0:28:33 阅读更多 →

最新新闻

中秘经贸往来现状与双边贸易整体情况介绍

中秘经贸往来现状与双边贸易整体情况介绍

本文聚焦中秘双边贸易发展现状,梳理2025年至2026年一季度贸易规模、产品结构特点,分析物流、关税、政策三大核心合作红利,客观剖析双边贸易的互补优势与发展潜力。1、贸易规模与结构近些年中秘双边贸易的发展势头确实十分亮眼,整体…

2026/7/23 1:03:43 阅读更多 →
鸿蒙 ArkTS 入门实战:校园午餐均衡记录的首屏状态与点击反馈

鸿蒙 ArkTS 入门实战:校园午餐均衡记录的首屏状态与点击反馈

鸿蒙 ArkTS 入门实战:校园午餐均衡记录的首屏状态与点击反馈 前言 校园午餐均衡记录是一个基于 ArkTS 与 ArkUI 声明式 UI 的鸿蒙示例项目,入口页面位于 entry/src/main/ets/pages/Index.ets。 本文围绕项目当前代码展开,结合 校园午餐记录…

2026/7/23 1:02:43 阅读更多 →
鸿蒙 ArkTS 实战:晨间清单板的时间线、天气同步与出门卡片设计

鸿蒙 ArkTS 实战:晨间清单板的时间线、天气同步与出门卡片设计

鸿蒙 ArkTS 实战:晨间清单板的时间线、天气同步与出门卡片设计 前言 晨间清单板是一个基于 ArkTS 与 ArkUI 声明式 UI 的鸿蒙示例项目,入口页面位于 entry/src/main/ets/pages/Index.ets。 本文围绕项目当前代码展开,结合 晨间流程 场景拆解…

2026/7/23 1:02:43 阅读更多 →
鸿蒙 ArkTS 实战:Course GPA Calculator 从课程绩点计算到成绩统计应用完整解析

鸿蒙 ArkTS 实战:Course GPA Calculator 从课程绩点计算到成绩统计应用完整解析

鸿蒙 ArkTS 实战:Course GPA Calculator 从课程绩点计算到成绩统计应用完整解析 前言 课程绩点计算 是一个典型的鸿蒙 ArkTS 轻量工具页面。它围绕“维护三门课程成绩,按绩点规则换算后计算平均 GPA,适合学期成绩整理。”这个明确需求&…

2026/7/23 1:02:43 阅读更多 →
Runway绿幕抠像实战手册(2024最新版):从穿帮帧识别到透明通道输出的全链路拆解

Runway绿幕抠像实战手册(2024最新版):从穿帮帧识别到透明通道输出的全链路拆解

更多请点击: https://codechina.net 第一章:Runway绿幕抠像的核心原理与2024技术演进 Runway的绿幕抠像(Green Screen Segmentation)并非传统基于色度键控(Chroma Key)的简单阈值分割,而是融合…

2026/7/23 1:01:43 阅读更多 →
2026如何解决Cloudflare 5秒盾/无限验证码问题?

2026如何解决Cloudflare 5秒盾/无限验证码问题?

在2026年的企业数字化运营中,公开数据采集、自动化测试、SEO监控已成为核心基础设施。然而,随着 Cloudflare 将其防护机制全面升级为以 Turnstile(无感验证) 和 AI 驱动的行为生物识别(Behavioral Biometrics&#xff…

2026/7/23 1:01:42 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻