代码说明:
#这个定义了当前目录下的dns列表文件,一行是一个dns服务器的IPv4地址。
input_file = 'dns_list.txt'
#这个定义了输出到当前目录的检测结果的文件名,我喜欢用txt格式,方便用记事本打开,但其实质是个CSV文件。
output_file = 'out.txt'
需要引入dnspython库
pip install dnspython
完整代码如下:
[Python] 纯文本查看 复制代码import dns.resolver
import time
import csv
import os
# 文件名配置
input_file = 'dns_list.txt'
output_file = 'out.txt' # CSV 格式输出
# 测试用域名列表,可根据需要修改
domains = [
'www.qq.com',
'www.baidu.com',
'www.163.com'
]
# DNS 查询超时设置(秒)
timeout = 2
retries = 3
# 检查输入文件是否存在
if not os.path.isfile(input_file):
print(f"错误:找不到输入文件 '{input_file}'。请将 DNS 服务器列表文件放在当前目录。")
exit(1)
# 读取 DNS 服务器列表
with open(input_file, 'r') as f:
servers = [line.strip() for line in f if line.strip()]
# 初始化解析器
resolver = dns.resolver.Resolver()
resolver.timeout = timeout
resolver.lifetime = timeout * retries
# 保存所有测试结果
results = []
for server in servers:
resolver.nameservers = [server]
for domain in domains:
print(f"测试DNS {server} 解析 {domain} ...", end=' ')
start = time.time()
try:
answers = resolver.resolve(domain)
elapsed_ms = (time.time() - start) * 1000
elapsed_ms = float(f"{elapsed_ms:.2f}")
ips = ",".join([rdata.to_text() for rdata in answers])
status = 'success'
print(f"成功,IP: {ips},耗时 {elapsed_ms} ms")
except Exception as e:
elapsed_ms = (time.time() - start) * 1000
elapsed_ms = float(f"{elapsed_ms:.2f}")
status = f'fail ({e})'
print(f"失败,错误: {e},耗时 {elapsed_ms} ms")
results.append({
'server': server,
'domain': domain,
'status': status,
'time_ms': elapsed_ms
})
# 按耗时从小到大排序
results.sort(key=lambda x: x['time_ms'])
# 将结果写入 CSV 文件
with open(output_file, 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['server', 'domain', 'status', 'time_ms']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for row in results:
writer.writerow(row)
print(f"所有测试完成,结果按耗时排序后已保存到 '{output_file}'。")