# 影刀RPA进阶教程:数据去重的5种方

影刀RPA进阶教程:数据去重的5种方法——从Excel去重到列表去重

采集数据时,重复记录是家常便饭。

picture.image 翻页采集可能采到上一页的商品,多个关键词搜索会重叠,滚动加载可能重复加载同一条内容。

影刀里有5种去重方法,从简单到复杂:Excel自带去重、列表去重、字典去重、集合去重、Python pandas去重。
下面按使用场景,每种给一个能直接用的例子。

picture.image


一、方法1:Excel自带去重(最简单,适合少量数据)

picture.image 采集完数据后,直接在Excel里操作:选中列 → 删除重复项。
但这个方法不能自动化,每次都要手动。

在影刀里自动化“Excel去重”:用“删除重复行”指令。

picture.image 操作步骤:

  1. 打开Excel文件
  2. 拖入“删除重复行”指令
  3. 选择去重的列(单列或多列)
  4. 保存

picture.image

# 示例:按A列(商品标题)去重,保留第一次出现
打开Excel("C:/采集结果.xlsx") → 【Excel对象】
删除重复行(【Excel对象】, 列索引=[1], 保留方式="保留第一个")

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/5f082126886b45a68d6a3b7c949a00f3~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781748113&x-signature=bifGiGDWbFjEYWIbE8YikxxmcOA%3D)
保存Excel(【Excel对象】)

影道指令精确名称:“删除重复行”在“Excel”分类下。可以指定多列联合去重。

picture.image 优点: 简单,不写代码。
缺点: 只能对已保存的Excel操作,不能在采集过程中实时去重。


picture.image

二、方法2:列表去重(采集过程中实时过滤)

场景:循环采集商品标题,采到一个就写入列表,写入前先判断是否已存在。

操作步骤:

  1. 创建一个空列表【已采集标题】
  2. 每次采集到标题后,用“判断列表是否包含”指令检查
  3. 如果不存在,才追加到列表并写入表格
【已采集标题】 = 创建列表()
循环相似元素列表(商品卡片):
    获取元素文本(标题) → 【标题】
    
    # 判断是否重复
    如果 列表包含(【已采集标题】, 【标题】) == False:
        追加数据到列表(【已采集标题】, 【标题】)
        追加一行数据到表格(Excel对象, 数据=[【标题】])
    否则:
        输出日志(f"重复商品:{【标题】},跳过")

注意: 当采集量达到几千条时,列表包含每次都要遍历整个列表,效率会下降。
此时可以用“字典”代替列表,查询速度更快。

影道指令精确名称:“判断列表是否包含”在“变量与数据”分类下。返回布尔值。

picture.image

三、方法3:字典去重(推荐,效率高)

用商品的唯一标识(如商品ID、链接)作为字典的“键”,文本作为“值”。
检查键是否存在是O(1)时间复杂度,万级数据也不卡。

操作步骤:

  1. 创建一个空字典【已采集字典】
  2. 每次采集到商品ID(从链接提取),检查字典中是否有这个键
  3. 没有则添加,并写入数据
【已采集字典】 = 创建字典()
循环相似元素列表(商品卡片):
    获取元素属性(链接, "href") → 【链接】
    # 从链接中提取商品ID(假设ID在url里)
    提取文本中间(【链接】, "/item/", ".html") → 【商品ID】
    
    # 判断键是否存在
    如果 字典包含键(【已采集字典】, 【商品ID】) == False:
        设置字典的值(【已采集字典】, 【商品ID】, "已采集")
        采集其他字段...
        写入Excel()
    否则:
        输出日志("重复商品")

字典 vs 列表性能对比:

  • 1000条数据:列表去重约0.01秒,字典去重0.001秒,差别不大
  • 10000条数据:列表去重约0.5秒,字典去重0.001秒,差距明显
  • 100000条数据:列表去重会卡顿几秒甚至更久

影道指令精确名称:“字典包含键”和“设置字典的值”在“变量与数据”分类下。

picture.image

四、方法4:集合去重(Python代码,一行搞定)

Python的集合(set)天然不允许重复元素。
如果你习惯用Python指令,可以把采集到的标题放进集合,最后转成列表。

操作步骤:

  1. 在循环中把标题追加到一个普通列表(不去重)
  2. 采集结束后,用Python代码将列表转为集合再转回列表,自动去重
# 采集时,不管重复,全部追加到【全部标题】(列表)
追加数据到列表(【全部标题】, 【标题】)

# 采集结束后,用Python去重
Python代码:
titles = 【全部标题】  # 从影刀传入
unique_titles = list(set(titles))  # 集合去重
print(unique_titles)  # 输出给影刀

缺点: 集合无序,会打乱原来的顺序。
解决: 如果需要保留顺序,用dict.fromkeys()

unique_ordered = list(dict.fromkeys(titles))
print(unique_ordered)

影道特有功能:Python代码指令中可以直接操作影道变量,要点亮Python图标。


五、方法5:Pandas去重(处理已有Excel文件)

如果你已经采集完一个大的Excel文件,里面有几千行重复数据,用Pandas最方便。
参考选题20(Pandas教程),这里专门讲去重。

外部Python脚本(去重.py):

import pandas as pd

df = pd.read_excel('采集结果.xlsx')

# 按“标题”列去重,保留第一次出现
df_dedup = df.drop_duplicates(subset=['标题'], keep='first')

# 按多列去重(标题+价格同时重复才算重复)
df_dedup = df.drop_duplicates(subset=['标题', '价格'], keep='first')

# 输出去重前后行数
print(f"去重前:{len(df)}行,去重后:{len(df_dedup)}行")

df_dedup.to_excel('采集结果_去重.xlsx', index=False)

在影刀中调用:

运行命令行("python C:/去重.py")
等待文件存在("C:/采集结果_去重.xlsx")
打开Excel("C:/采集结果_去重.xlsx") → 【去重后数据】

影道指令精确名称:“运行命令行”可以调用外部Python脚本。需要本地安装pandas。


六、去重方法决策表

场景推荐方法理由
采集后手动处理Excel删除重复行最简单
采集过程中实时去重(数据量<1万)列表包含易懂,性能够用
采集过程中实时去重(数据量>1万)字典/集合查询快
需要保留采集顺序字典或列表+Python dict.fromkeys集合会打乱顺序
采集完成后对Excel去重Pandas功能强大,支持多列
不想写代码Excel删除重复行指令影刀内置

七、完整案例:滚动加载 + 实时去重采集

# 初始化
【已采集ID】 = 创建字典()  # 用于快速去重
【全部数据】 = 创建列表()   # 存储唯一数据用于最终写入

# 滚动加载循环(略)
滚动到页面底部()
获取相似元素列表(商品卡片) → 【卡片列表】

ForEach列表循环(【卡片列表】):
    # 获取唯一标识(商品ID)
    获取元素属性(当前循环项, "data-id") → 【商品ID】
    
    # 去重判断
    如果 字典包含键(【已采集ID】, 【商品ID】) == False:
        # 记录已采集
        设置字典的值(【已采集ID】, 【商品ID】, "1")
        
        # 采集字段
        获取元素文本(当前循环项, ".//h3") → 【标题】
        获取元素文本(当前循环项, ".//span[@class='price']") → 【价格】
        
        # 存入临时列表
        追加数据到列表(【全部数据】, [【标题】, 【价格】])
        
# 滚动结束,写入Excel
打开Excel("C:/结果.xlsx")
写入行数据(第1行, ["标题", "价格"])
【行号】 = 2
ForEach列表循环(【全部数据】):
    写入行数据到表格(Excel对象, 行号=【行号】, 数据=当前循环项)
    【行号】 = 【行号】 + 1
保存Excel()
输出日志(f"采集完成,共{获取列表长度(【全部数据】)}条不重复数据")

常见问题速查

问题解决方法
列表包含判断总是返回False检查变量类型:数字和文本不匹配。用“转为文本”统一类型
字典去重时键不存在报错用“字典包含键”判断,不要直接取值
去重后数据量少了很多确认去重依据的字段是否合理(不同商品可能有相同标题)
Excel删除重复行指令报错检查Excel是否被其他程序打开;去重列索引从1开始
集合去重打乱顺序list(dict.fromkeys(原列表))保持顺序
采集过程中去重导致内存爆炸定期把【已采集ID】写入文件并清空,分批次处理

推荐资源

  • 影刀官方帮助中心搜“去重”,有Excel删除重复行的视频教程
  • 推荐阅读:Python数据结构(列表、字典、集合)的时间复杂度对比
  • 在线工具:如果数据量不大,可以用在线去重工具(如tool.oschina.net/regex)

经验之谈:采集时就做好去重,比采集完再处理高效得多。实时去重还能减少写入次数,提升整体速度。


作者:林焱

本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。

0
0
0
0
评论
未登录
暂无评论