采集数据时,重复记录是家常便饭。
翻页采集可能采到上一页的商品,多个关键词搜索会重叠,滚动加载可能重复加载同一条内容。
影刀里有5种去重方法,从简单到复杂:Excel自带去重、列表去重、字典去重、集合去重、Python pandas去重。
下面按使用场景,每种给一个能直接用的例子。
一、方法1:Excel自带去重(最简单,适合少量数据)
采集完数据后,直接在Excel里操作:选中列 → 删除重复项。
但这个方法不能自动化,每次都要手动。
在影刀里自动化“Excel去重”:用“删除重复行”指令。
操作步骤:
- 打开Excel文件
- 拖入“删除重复行”指令
- 选择去重的列(单列或多列)
- 保存
# 示例:按A列(商品标题)去重,保留第一次出现
打开Excel("C:/采集结果.xlsx") → 【Excel对象】
删除重复行(【Excel对象】, 列索引=[1], 保留方式="保留第一个")

保存Excel(【Excel对象】)
影道指令精确名称:“删除重复行”在“Excel”分类下。可以指定多列联合去重。
优点: 简单,不写代码。
缺点: 只能对已保存的Excel操作,不能在采集过程中实时去重。
二、方法2:列表去重(采集过程中实时过滤)
场景:循环采集商品标题,采到一个就写入列表,写入前先判断是否已存在。
操作步骤:
- 创建一个空列表【已采集标题】
- 每次采集到标题后,用“判断列表是否包含”指令检查
- 如果不存在,才追加到列表并写入表格
【已采集标题】 = 创建列表()
循环相似元素列表(商品卡片):
获取元素文本(标题) → 【标题】
# 判断是否重复
如果 列表包含(【已采集标题】, 【标题】) == False:
追加数据到列表(【已采集标题】, 【标题】)
追加一行数据到表格(Excel对象, 数据=[【标题】])
否则:
输出日志(f"重复商品:{【标题】},跳过")
注意: 当采集量达到几千条时,列表包含每次都要遍历整个列表,效率会下降。
此时可以用“字典”代替列表,查询速度更快。
影道指令精确名称:“判断列表是否包含”在“变量与数据”分类下。返回布尔值。
三、方法3:字典去重(推荐,效率高)
用商品的唯一标识(如商品ID、链接)作为字典的“键”,文本作为“值”。
检查键是否存在是O(1)时间复杂度,万级数据也不卡。
操作步骤:
- 创建一个空字典【已采集字典】
- 每次采集到商品ID(从链接提取),检查字典中是否有这个键
- 没有则添加,并写入数据
【已采集字典】 = 创建字典()
循环相似元素列表(商品卡片):
获取元素属性(链接, "href") → 【链接】
# 从链接中提取商品ID(假设ID在url里)
提取文本中间(【链接】, "/item/", ".html") → 【商品ID】
# 判断键是否存在
如果 字典包含键(【已采集字典】, 【商品ID】) == False:
设置字典的值(【已采集字典】, 【商品ID】, "已采集")
采集其他字段...
写入Excel()
否则:
输出日志("重复商品")
字典 vs 列表性能对比:
- 1000条数据:列表去重约0.01秒,字典去重0.001秒,差别不大
- 10000条数据:列表去重约0.5秒,字典去重0.001秒,差距明显
- 100000条数据:列表去重会卡顿几秒甚至更久
影道指令精确名称:“字典包含键”和“设置字典的值”在“变量与数据”分类下。
四、方法4:集合去重(Python代码,一行搞定)
Python的集合(set)天然不允许重复元素。
如果你习惯用Python指令,可以把采集到的标题放进集合,最后转成列表。
操作步骤:
- 在循环中把标题追加到一个普通列表(不去重)
- 采集结束后,用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学习手册》系列文章之一,内容源于实操经验的整理与分享。
