是否可以从两个以上的 dns 服务器并行解析列表?

Is that possible to parallel resolve list from two+ dns servers?

我是 python 的新手,老实说,我完全不懂编程。在 Google 的帮助和我猜的运气的帮助下,我制作了我的第一个解析域列表的脚本。

域列表包含大约 100 000 个域,我必须优化完成此任务的时间,因为它会重复任务,现在需要大约两个小时才能完成。我可以单独拆分列表和 运行 每个脚本,但如果可能设置 2 个或更多 DNS 服务器并从它们并行解析,那就太好了。 或者有更多方法可以优化运行宁时间?

我已经阅读了 dnspython 的文档,但是对于我的 python 技能水平(~0)来说它太复杂了。

import socket
import dns.resolver

w = open ('/home/dalt/pyth/resolved.txt', "w")
x = open ('/home/dalt/pyth/not_resolved.txt', "w")
with open('/home/dalt/pyth/domains2.txt') as f:
    my_list = [line.strip() for line in f.readlines()]

resolver = dns.resolver.Resolver()
resolver.nameservers=[socket.gethostbyname('212.xxx.xxx.134')]

for domain in my_list:
    try:
        q = resolver.query(domain, 'A')
        for ipval in q:
            print(ipval, file=w)
    except dns.resolver.NXDOMAIN:
            print(domain, 'NXDOMAIN', file=x)
    except dns.resolver.NoNameservers:
        print(domain, 'NoNameservers',file=x)
    except dns.resolver.NoAnswer:
        print(domain, 'NoAnswer',file=x)
    except dns.name.BadEscape:
        print(domain, 'BadEscape',file=x)

f.close()

我对网络不是很有经验,但我猜你脚本的大部分执行时间来自于与 DNS 服务器的通信,这意味着你的 CPU 大部分只是在等待数据,这意味着您应该能够通过使用多线程来优化任务。

用一个最简单ThreadPool:

from multiprocessing.pool import ThreadPool
import socket

import dns.resolver

my_list = [
    "www.google.com",
    "www.facebook.com",
    "doesnt.exist",
]

resolver = dns.resolver.Resolver()
resolver.nameservers=[
    socket.gethostbyname("8.8.4.4"),
    socket.gethostbyname("8.8.8.8"),
]

w = open("resolved.txt", "w")
x = open("not_resolved.txt", "w")

def resolve(domain):
    try:
        q = resolver.query(domain, "A")
        for ipval in q:
            print(domain, ipval, file=w)
    except dns.resolver.NXDOMAIN:
        print(domain, "NXDOMAIN", file=x)
    except dns.resolver.NoNameservers:
        print(domain, "NoNameservers", file=x)
    except dns.resolver.NoAnswer:
        print(domain, "NoAnswer", file=x)
    except dns.name.BadEscape:
        print(domain, "BadEscape", file=x)

pool = ThreadPool(processes=10)  # increasing this number may speed things up
results = pool.map(resolve, my_list)

w.close()
x.close()

结果:

$ cat not_resolved.txt
doesnt.exist NXDOMAIN
$ cat resolved.txt
www.google.com 172.217.20.196
www.facebook.com 31.13.81.36

以上代码不会尝试在可用的 DNS 服务器之间分发域列表,除非 dnspython 程序包在后台执行此操作。但我希望即使是单个 DNS 服务器也能非常快速地响应并发查询,因为它本身可能使用多个线程。