批量域名解析
"""
Excel域名解析工具 v1.3
功能:读取Excel中的域名列,解析A记录并添加到右侧新列
"""
import pandas as pd
from dns import resolver
from dns.exception import DNSException
配置参数(可根据需要修改)
INPUT_FILE = "input.xlsx" # 输入文件名
OUTPUT_FILE = "output.xlsx" # 输出文件名
DNS_SERVERS = ["223.5.5.5", "223.6.6.6"] # 阿里公共DNS
TIMEOUT = 5 # 解析超时时间(秒)
COLUMN_NAME = "域名" # 域名列名称
IP_PATTERN = r'^((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$' # IP正则
def resolve_domain(domain: str) -> str:
"""
解析域名的A记录
:param domain: 要解析的域名
:return: 逗号分隔的IP地址或错误信息
"""
resolver_obj = resolver.Resolver()
resolver_obj.nameservers = DNS_SERVERS
resolver_obj.timeout = TIMEOUT
resolver_obj.lifetime = TIMEOUT
try:
# 清理域名输入
clean_domain = domain.strip().lower()
clean_domain = clean_domain.replace("https://", "").replace("http://", "")
clean_domain = clean_domain.split("/")[0].split(":")[0]
# 空域名检查
if not clean_domain:
return "空域名"
# 执行DNS查询
answers = resolver.resolve(clean_domain, 'A')
return ', '.join([answer.address for answer in answers])
except resolver.NXDOMAIN:
return "域名不存在"
except resolver.NoAnswer:
return "无A记录"
except resolver.NoNameservers:
return "DNS服务器故障"
except resolver.Timeout:
return "查询超时"
except DNSException as e:
return f"DNS错误: {str(e)}"
except Exception as e:
return f"解析异常: {str(e)}"
def main():
try:
# 读取Excel文件
df = pd.read_excel(INPUT_FILE, engine='openpyxl')
# 检查域名列是否存在
if COLUMN_NAME not in df.columns:
raise ValueError(f"Excel文件中缺少'{COLUMN_NAME}'列")
# 执行域名解析
print("正在解析域名...")
df["解析结果"] = df[COLUMN_NAME].apply(resolve_domain)
# 调整列顺序到域名列右侧
columns = list(df.columns)
domain_index = columns.index(COLUMN_NAME)
columns.insert(domain_index + 1, columns.pop(columns.index("解析结果")))
df = df[columns]
# 保存结果
df.to_excel(OUTPUT_FILE, index=False, engine='openpyxl')
print(f"解析完成!结果已保存到:{OUTPUT_FILE}")
# 统计成功数量
success_count = len(df[df["解析结果"].str.contains(IP_PATTERN, regex=True)])
print(f"成功解析记录:{success_count}/{len(df)} 条")
if success_count < len(df):
error_count = len(df) - success_count
print(f"失败明细:")
print(df[df["解析结果"].str.contains(IP_PATTERN, regex=True) == False]["解析结果"].value_counts())
except FileNotFoundError:
print(f"错误:输入文件 {INPUT_FILE} 不存在")
except PermissionError:
print(f"错误:输出文件 {OUTPUT_FILE} 被占用,请关闭文件后重试")
except Exception as e:
print(f"程序运行异常:{str(e)}")
if name == "main":
print(r"""
____ _ _ ____ ___ __ _ ____
( _ / )( ( )/ )( / )( )
) /) / ( ) )( ( ) ( ) _)
() _/(____)_)(___)(____)
""")
main()