做SEO的人电脑里都有几个"祖传"txt文件——从各种渠道扒下来的URL列表、关键词词库、域名清单,少则几千行,多则几十万行。打开一看,一眼就能发现一堆重复行,但真正让人头疼的不是那些完全一样的行,而是长得差不多但实际上不同的"半重复"。同一个URL后面带了不同参数、同一个关键词换了词序、同一个域名带着不同路径——这些你用Excel"删除重复行"根本清不掉。
去重的三个层次,大部分人只用到了第一层
| 1 | 完全重复:两行内容一模一样,Excel能搞定 |
| 2 | 按字段去重:两行不完全一样,但某个关键字段相同就算重复,比如同一域名下的不同URL |
| 3 | 相似度去重:文本相似度超过某个阈值就算重复,比如"深圳装修多少钱一平"和"深圳装修一平米多少钱" |
一、完全重复:在线工具一行代码都不用写
如果只是去重完全相同的行,现在在线工具的体验已经非常成熟了。把内容粘贴进去,点一下按钮,几万行数据秒级去完。常用的几款我做了个对比:
| 工具 | 最大处理量 | 特色功能 | 适合场景 |
|---|---|---|---|
| UU在线工具 | 50万行 | 自定义分隔符、导出txt | 大批量关键词/URL列表 |
| selfboot文本去重 | 30万行 | 去空行、大小写敏感、排序输出 | 需要保留顺序的关键词库 |
| GenTools | 20万行 | 上传文件+保留首次/末次 | 需要保留特定出现位置的场景 |
| ToolKun | 10万行 | 忽略空格、忽略大小写 | 格式不规范的文本清洗 |
| 49Tool | 10万行 | 站长工具箱集成、批量打开网址 | 站长日常运维用 |
这几款工具对"完全重复"的处理都很靠谱,选哪个主要看数据量。10万行以内随便用,超过30万行建议用UU在线工具,它的处理上限最高,而且支持自定义分隔符,数据格式不标准的时候能救命。
一个容易被忽略的细节:去重前先检查有没有空行和首尾空格。很多工具默认"带空格的相同文本"不算重复,比如"深圳装修"和"深圳装修 "(末尾多了个空格)会被当成两条不同数据保留下来。绝大多数在线工具都有"去除首尾空格"的选项,去重之前勾上。

二、按字段去重:同一个域名的URL只留一条
这是站长的刚需场景。你扒了一个竞争对手的外链列表,里面有2000条URL,但很多URL来自同一个域名——www.example.com/page1、www.example.com/page2、www.example.com/page3……你的目标不是按完整URL去重,而是按主域名去重,每个域名只保留一条URL。这种需求在线工具能解决的就不多了。
UU在线工具提供了一个"按域名去重"功能,粘贴URL列表后自动提取主域名,每个域名只保留第一条链接。如果需求刚好匹配,这个工具足够用了。但如果你的规则更复杂——比如想按二级域名去重、或者想保留每个域名下收录最多的那条URL——那就要上Python了。
from urllib.parse import urlparsefrom collections import defaultdict# 按主域名去重,每个域名只保留一条URLdef dedup_by_domain(url_list):domain_map = {}for url in url_list:domain = urlparse(url).netloc # 提取主域名if domain not in domain_map:domain_map[domain] = urlreturn list(domain_map.values())# 读取文件with open('urls.txt', 'r', encoding='utf-8') as f:urls = [line.strip() for line in f if line.strip()]result = dedup_by_domain(urls)with open('urls_deduped.txt', 'w', encoding='utf-8') as f:for url in result:f.write(url + '\n')print(f"原始URL: {len(urls)} 条")print(f"去重后: {len(result)} 个独立域名")这个脚本的逻辑很简单:遍历每条URL,用urlparse提取域名部分,用字典的key天然去重特性保证每个域名只存一条。如果需要更灵活的规则——比如想保留每个域名下路径最短的那条URL(首页链接最干净),把字典的赋值逻辑改成按路径长度比较就行。
URL列表去重
在线工具做完全重复就够了。按域名去重用Python脚本,按路径去重可以用正则匹配URL前缀。
关键词库去重
完全重复用在线工具。但要小心"深圳装修""装修深圳""深圳装修公司"这种语义相近的词——Excel和在线工具都搞不定,得上模糊匹配。
域名清单去重
最常用的场景:去重后统计独立域名数。注意www和非www版本是不是算同一个域名,你的规则要先定清楚。
邮箱/手机号去重
完全重复用在线工具。额外注意格式标准化:手机号去86前缀、邮箱去点号变体(g.mail和gmail是同一个邮箱)。
三、相似度去重:长得像但不是一模一样的东西怎么筛
这是去重里最难的一层,也是真正能帮你省时间的。场景是这样的:你从5118、百度下拉框、相关搜索、Google Keyword Planner四个渠道采了1万条关键词,合在一起发现很多词换了个顺序就重了——"深圳装修公司哪家好"和"深圳哪家装修公司好",字都一样就是顺序不一样。纯文本去重完全识别不了这种重复。
解决这个问题需要用到模糊匹配。Python里最常用的库是fuzzywuzzy(现在叫thefuzz),核心思路是计算两段文本的相似度分数,超过阈值就判定为重复。
from thefuzz import fuzz# 关键词相似度去重,阈值85分def fuzzy_dedup(keywords, threshold=85):unique = []for kw in keywords:is_dup = Falsefor existing in unique:# token_sort_ratio会先分词排序再比较,无视词序差异if fuzz.token_sort_ratio(kw, existing) >= threshold:is_dup = Truebreakif not is_dup:unique.append(kw)return unique# 示例keywords = ["深圳装修公司哪家好","深圳哪家装修公司好","北京装修公司推荐","深圳装修公司排名"]result = fuzzy_dedup(keywords, threshold=85)print(f"去重前: {len(keywords)} 条")print(f"去重后: {len(result)} 条")token_sort_ratio的工作原理是先把两个字符串分别拆成词,然后分别排序,再比较排序后的结果。所以"深圳装修公司哪家好"和"深圳哪家装修公司好"分词排序后都会变成类似["好","哪家","深圳","公司","装修"]的序列,相似度能到90分以上。这就是为什么它能无视词序差异。
阈值怎么定?

· 95分以上:基本就是同一个词换了顺序,直接去重,误杀率极低
· 85-95分:大概率是同一个搜索意图的不同表达,建议保留一条,手动抽查
· 75-85分:可能有语义重叠但也可能是不同需求,不建议自动去重,标注出来人工判断
· 75分以下:基本是不同的词,不去重
模糊去重有个性能问题需要注意:fuzzywuzzy的算法是O(n²),1万条关键词两两比较就是一亿次计算,纯Python跑完要好几分钟。如果数据量超过5000条,建议先用完全去重把数据量压下来,再做模糊去重,或者用rapidfuzz替代fuzzywuzzy——它是C++实现,同样的算法快5-10倍。
四、Excel去重:多数人只用到了它10%的能力
Excel的"删除重复项"是最常用的去重方式,但它有好几个使用层次,大部分人只停留在第一层:选中所有列→删除重复项→整行去重。实际上Excel的去重能力远不止于此。
| 去重方式 | 操作路径 | 适用场景 | 局限性 |
|---|---|---|---|
| 整行去重 | 数据 → 删除重复项 → 全选列 | 完全相同的行 | 只能删完全一致的,一个空格差异就认不出 |
| 指定列去重 | 数据 → 删除重复项 → 只勾选关键列 | 按域名/手机号/ID等关键字段去重 | 保留的是第一次出现的行,不能自定义保留哪条 |
| 高级筛选 | 数据 → 高级 → 选择不重复的记录 | 不想删原数据,只想提取唯一值 | 处理速度比删除重复项慢 |
| Power Query | 数据 → 从表格 → 右键列 → 删除重复项 | 大量数据+跨表处理+需要保留处理步骤 | 需要一点Power Query基础 |
| COUNTIF标记 | =IF(COUNTIF($A$2:A2,A2)=1,"保留","重复") | 需要看到每次重复出现的情况,而不是直接删 | 公式拖拽在大数据量下会卡 |
Power Query是Excel里被严重低估的去重工具。它的核心优势不是去重本身,而是去重过程可追溯——每一步操作都会被记录成一个步骤,下次打开文件刷新一下就能自动重新执行整个清洗流程。如果你的去重工作是周期性的(比如每周要处理一批新的外链列表),用Power Query建一个清洗模板,比每次手动操作省太多时间。
五、百万级数据怎么去重——在线工具和Excel都扛不住了
当你手里的数据超过100万行时,在线工具会崩、Excel会卡死、Python的内存也可能爆。这时候就要换思路了。
在线工具上限
50万行
UU在线工具最高承载
Excel上限
104万行
实际50万行就开始卡
Python pandas上限
内存/3倍
8G内存约处理500万行

分块处理方案
无上限
chunksize分块读取
处理百万级以上数据的核心策略是分块读取 + 逐批去重。pandas的read_csv支持chunksize参数,每次只读10万行到内存,去重后再读下一批。最终把所有分块结果合并再做一次全局去重。
import pandas as pd# 分块去重:每次读10万行,合并后全局去重chunks = []for chunk in pd.read_csv('huge_data.csv', chunksize=100000):# 先做块内去重chunk = chunk.drop_duplicates()chunks.append(chunk)# 合并所有块df = pd.concat(chunks, ignore_index=True)# 跨块全局去重df = df.drop_duplicates()print(f"去重后剩余: {len(df)} 行")df.to_csv('deduped_data.csv', index=False)如果连分块都撑不住(比如数据有几千万行),就需要上数据库方案了。把数据导入SQLite或者MySQL,建唯一索引,重复数据在导入阶段就会被自动过滤掉。这是处理超大规模数据的终极方案。
一个省时间的思路:如果你是在做站群内容管理,与其每次手动去重关键词和URL列表,不如用UC建站系统的内容中台统一管理。系统内置了去重和差异化重组机制,不同站点发布的内容会自动做角度和结构上的区分,不会出现多个站发一模一样内容的问题。手工去重花的时间,放在系统层面只需要设置一次规则。
六、去重时最容易犯的三个错
错法一:不检查就去重
去重前至少做两件事:看一眼原始数据的格式是否统一(有没有编码问题导致的乱码重复、有没有换行符不一致)、确认一下"重复"的定义是什么(完全匹配?按某列?相似度多少分?)。别上来就点删除重复项,删完发现规则错了还得重新来。
错法二:去重后不统计损失
去重完成后一定要看两个数字:原始数据量、去重后数据量。如果去掉了超过50%的数据,说明数据源有问题或者采集规则有缺陷,不是数据本身的错。如果只去掉了不到5%,要么数据质量很好,要么你的去重规则太松了,可能有漏网之鱼。建议每次去重后随机抽20条结果人工看一下。
错法三:模糊去重阈值一刀切
所有数据都用同一个阈值(比如85分)去模糊去重是有风险的。短文本(10字以内)相似度容易偏高,阈值可以设高一点(90分以上)。长文本(50字以上)相似度容易偏低,阈值可以降到80分。不同长度的数据用不同的阈值,能减少误杀和漏网。
批量去重这件事,说穿了就是一个"定义"问题。你先把"什么叫重复"定义清楚了,工具的选择就水到渠成。完全相同的行用在线工具,按字段去重用Python脚本,相似度去重用模糊匹配,百万级以上用分块或数据库。别一上来就钻技术细节,先想清楚你的数据里到底什么是重复,再去选对应的武器。
