首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中批量/批量DNS查找?

在python中批量/批量DNS查找?
EN

Stack Overflow用户
提问于 2015-12-19 22:54:41
回答 1查看 3.8K关注 0票数 3

我有一个脚本,它以下列方式获取DNS (CNAME、MX、NS)数据:

代码语言:javascript
复制
from dns import resolver
...

def resolve_dns(url):
    response_dict = {}
    print "\nResolving DNS for %s" % (url)

    try: 
        response_dict['CNAME'] = [rdata for rdata in resolver.query(url, 'CNAME')]
    except:
        pass

    try: 
        response_dict['MX'] = [rdata for rdata in resolver.query(url, 'MX')]
    except:
        pass

    try: 
        response_dict['NS'] = [rdata for rdata in resolver.query(url, 'NS')]
    except:
        pass

    return response_dict

此函数将对连续URL进行顺序调用。如果可能的话,我希望通过同时获取多个URL的数据来加快上述过程。

是否有一种方法来完成上面的脚本对一批URL所做的工作(可能会返回一个dict对象的列表,每个dict对应于特定URL的数据)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-20 01:39:17

您可以将工作放入线程池中。您的resolve_dns连续执行3次请求,因此我创建了一个稍微通用的工作人员,它只执行1次查询,并使用collections.product生成所有组合。在线程池中,我将块大小设置为1,以减少线程池批处理,如果某些查询需要很长时间,这可能会增加执行时间。

代码语言:javascript
复制
import dns
from dns import resolver
import itertools
import collections
import multiprocessing.pool

def worker(arg):
    """query dns for (hostname, qname) and return (qname, [rdata,...])"""
    try:
        url, qname = arg
        rdatalist = [rdata for rdata in resolver.query(url, qname)]
        return qname, rdatalist
    except dns.exception.DNSException, e:
        return qname, []

def resolve_dns(url_list):
    """Given a list of hosts, return dict that maps qname to
    returned rdata records.
    """
    response_dict = collections.defaultdict(list)
    # create pool for querys but cap max number of threads
    pool = multiprocessing.pool.ThreadPool(processes=min(len(url_list)*3, 60))
    # run for all combinations of hosts and qnames
    for qname, rdatalist in pool.imap(
            worker, 
            itertools.product(url_list, ('CNAME', 'MX', 'NS')),
            chunksize=1):
        response_dict[qname].extend(rdatalist)
    pool.close()
    return response_dict

url_list = ['example.com', 'stackoverflow.com']
result = resolve_dns(url_list)
for qname, rdatalist in result.items():
    print qname
    for rdata in rdatalist:
        print '   ', rdata
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34376244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档