名前解決に時間がかかっている可能性があります。それを数えれば (つまり、何らかの形で dig が非常に迅速に返された場合)、Python は何千ものエントリを簡単に処理できるはずです。
つまり、スレッド化されたアプローチを試す必要があります。これは、(理論的には)順次ではなく、同時に複数のアドレスを解決します。そのために引き続き dig を使用することもできます。そのために以下のサンプル コードを変更するのは簡単なはずですが、興味深いものにするために (そしてうまくいけばもっと Pythonic に)、既存のモジュールを使用してみましょう: dnspython
したがって、次のようにインストールします。
sudo pip install -f http://www.dnspython.org/kits/1.8.0/ dnspython
そして、次のようなことを試してください。
import threading
from dns import resolver
class Resolver(threading.Thread):
def __init__(self, address, result_dict):
threading.Thread.__init__(self)
self.address = address
self.result_dict = result_dict
def run(self):
try:
result = resolver.query(self.address)[0].to_text()
self.result_dict[self.address] = result
except resolver.NXDOMAIN:
pass
def main():
infile = open("domainlist", "r")
intext = infile.readlines()
threads = []
results = {}
for address in [address.strip() for address in intext if address.strip()]:
resolver_thread = Resolver(address, results)
threads.append(resolver_thread)
resolver_thread.start()
for thread in threads:
thread.join()
outfile = open('final.csv', 'w')
outfile.write("\n".join("%s,%s" % (address, ip) for address, ip in results.iteritems()))
outfile.close()
if __name__ == '__main__':
main()
同時に開始するスレッドが多すぎることが判明した場合は、バッチで実行するか、キューを使用してみてください (例については、http://www.ibm.com/developerworks/aix/library/au-threadingpython/を参照してください)。 )