1

我对 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()
4

1 回答 1

1

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

最容易使用 a 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 服务器也会对并发查询做出非常快速的响应,因为它本身可能使用多个线程。

于 2020-11-05T15:31:39.987 回答