使用Python从拦截列表文本文件中提取FQDN并实现去重排序
实现思路
- 逐行处理抓取到的文本内容,先删除所有
#开头的注释行以及行内#后的注释内容 - 过滤掉IP前缀(
127.0.0.1、0.0.0.0),提取后续的域名部分 - 用简单的正则匹配验证提取的内容是否符合FQDN格式规则,避免误抓无效内容
- 用集合自动去重,再按字母顺序排序后输出到最终文件
优化后可直接运行的完整代码
#!/usr/bin/env python3 import urllib.request import re # 简化版FQDN匹配正则,适配拦截列表场景的域名识别需求 FQDN_PATTERN = re.compile(r'^(?=.{1,253}$)(?:(?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,63}$') if __name__ == '__main__': # 读取URL列表,自动跳过空行 with open("blocklist_urls.txt", "r", encoding="utf-8") as f: urls = [u.strip() for u in f.readlines() if u.strip()] domain_set = set() # 逐URL抓取并提取域名 for url in urls: try: resp = urllib.request.urlopen(url, timeout=10) content = resp.read().decode("utf-8") # 逐行处理内容 for line in content.splitlines(): # 去掉行内注释和首尾空白 raw_line = line.split('#', 1)[0].strip() if not raw_line: continue # 分割行内容,取最后一段作为候选域名(同时适配带IP前缀/纯域名两种格式) candidate = raw_line.split()[-1].strip() # 验证格式符合FQDN后加入集合自动去重 if FQDN_PATTERN.match(candidate): domain_set.add(candidate.lower()) except Exception as e: print(f"处理URL {url} 时出错:{str(e)},已跳过该URL") # 按字母顺序排序域名 sorted_domains = sorted(domain_set) # 写入最终结果文件 with open("blocklist_final.txt", "w", encoding="utf-8") as f: for domain in sorted_domains: f.write(f"{domain}\n") print(f"处理完成,共提取有效域名 {len(sorted_domains)} 个,已保存到 blocklist_final.txt")
代码优化说明
- 去掉了原有代码中反复修改
sys.stdout、多次读写中间文件的冗余逻辑,全程在内存中处理去重排序,执行效率更高 - 增加了异常捕获逻辑,单个URL抓取/解析失败不会导致整个脚本中断
- 用正则验证域名格式,比单纯判断点的数量准确率更高,不会误抓IP、含特殊字符的无效内容
- 自动将域名转为小写,避免大小写差异导致的重复域名
- 适配你给出的所有拦截列表格式:带127.0.0.1前缀、带0.0.0.0前缀、无前缀纯域名、行尾带注释的域名都可以正确提取
内容的提问来源于stack exchange,提问作者Mr. Clean
相关产品推荐
相关产品推荐

