是否可以从两个以上的 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 服务器也能非常快速地响应并发查询,因为它本身可能使用多个线程。
我是 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 服务器也能非常快速地响应并发查询,因为它本身可能使用多个线程。