可以指定dns查询,脱离本地dns设置。
import socket,os,re
def dns_remote_resolve(qname, dnsserver, timeout=None, blacklist=set(), max_retry=2, max_wait=2):
for i in xrange(max_retry):
index = os.urandom(2)
host = ''.join(chr(len(x))+x for x in qname.split('.'))
data = '%s\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00%s\x00\x00\x01\x00\x01' % (index, host)
address_family = socket.AF_INET6 if ':' in dnsserver else socket.AF_INET
sock = None
try:
sock = socket.socket(family=address_family, type=socket.SOCK_DGRAM)
if isinstance(timeout, (int, long)):
sock.settimeout(timeout)
sock.sendto(data, (dnsserver, 53))
for i in xrange(max_wait):
data = sock.recv(512)
iplist = ['.'.join(str(ord(x)) for x in s) for s in re.findall('\xc0.\x00\x01\x00\x01.{6}(.{4})', data) if all(ord(x)<=255 for x in s)]
iplist = [x for x in iplist if x not in blacklist]
if iplist:
return iplist
except socket.error as e:
if e[0] in (10060, 'timed out'):
continue
except Exception, e:
raise
finally:
if sock:
sock.close()
print dns_remote_resolve('www.baidu.com','8.8.8.8')