批量测试DNS服务器解析速度

查看 71|回复 8
作者:letum   
这段时间好像当地ISP接入商提供的DNS给加了个广告,就想用个公众DNS试试,国外那些8.8.8.8 8.8.4.4啥的估计都被污染了,阿里的223.5.5.5、223.6.6.6以及百度的、360的、腾讯的、114的,找了一大堆,选了几个手工ping了一下看了看速度,但还是想比较一下它们解析域名的速度,这个和ping的速度是不一样的。于是就让ChatGPT给写了段代码,我稍微改了下,不知道使用了AI还算不算原创。
代码说明:
#这个定义了当前目录下的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}'。")

文件, 测试

hupoquan   

有没有成品?懒得折腾
LiYon   

感谢分享
anjie1977   

有没有类似于dnstools的功能,大佬
保温板   

有没有成品?懒得折腾
penz   

折腾个成品,嘻嘻
qqdns   

感谢分享,还可以可以改其他域名来解析 dns解析.py
天之鹏   

懒人 期待成品直接双击
zdg1   

感谢分享,期待成品。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部