Запросите массив записей DNS с помощью dnspython и перейдите к следующему элементу на основе заданного времени ожидания

Я запрашиваю кучу записей DNS с dnspythonкажется, что тайм-аут, когда ответ не получен (dns.exception.Timeout: The DNS operation timed out after 30.0006685256958 seconds).

Вот функция:

def dnstest(domain):
    dnsrecords = []
    record_types = ['A', 'AAAA', 'CNAME', 'MX', 'SRV', 'TXT', 'SOA', 'NS']
    dnsResolver = dns.resolver.Resolver()
    for record in record_types:
        dnsAnswer = dnsResolver.query(domain, record)
        for rdata in dnsAnswer:
            dnsrecords.append(rdata)
    return(dnsrecords)

print(dnstest("github.com"))

тогда как, если я сделаю запрос на существующие записи DNS, ответ будет получен:
dnsAnswer = dnsResolver.query(domain, 'A')

Я предполагаю, что это потому, что определенные записи (такие как SRV, AAAA и т. д.) не существует для github.com, Тем не менее, они существуют для других доменов. Есть ли способ включить тайм-аут (например, 5 секунд) для запроса в пределах for цикл?
Что-то вроде -
if no response in 5 seconds, move to next element in the array
Или есть лучший подход для исключения несуществующих записей?

1 ответ

Следующее сработало для меня после некоторого быстрого поиска в Google.

import dns.resolver

def dnstest(domain):
    dnsrecords = []
    record_types = ['A', 'AAAA', 'CNAME', 'MX', 'SRV', 'TXT', 'SOA', 'NS']
    dnsResolver = dns.resolver.Resolver()
    dnsResolver.timeout = 1
    dnsResolver.lifetime = 1
    for record in record_types:
        try:
            dnsAnswer = dnsResolver.query(domain, record)
            for rdata in dnsAnswer:
                dnsrecords.append(rdata)
        except:
            pass

    return(dnsrecords)
Другие вопросы по тегам