Python第三方模块dnspython介绍
Python第三方模块dnspython介绍
安装
pip install dnspython
模块域名解析方法介绍
dnspython提供了一个DNS解析器类–resolver,使用它的query方法来实现域名的查询功能。query方法定义如下:
query(self, qname, rdtype=1, rdclass=1, tcp=False, source=None, raise_on_no_answer=True, source_port=0)
其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种:
- A记录,将主机名转换成IP地址;
- MX记录,邮件交换记录,定义邮件服务器的域名;
- CNAME记录,指别名记录,实现域名间的映射;
- NS记录,标记区域的域名服务器及授权子域;
- PTR记录,反向解析,与A记录相反,将IP转换成主机名;
- SOA记录,SOA标记,一个起始授权区的定义。
rdclass参数用于指定网络类型,可选的值有IN、CH与HS,其中IN为默认,使用最广泛。
tcp参数用于指定查询是否启用TCP协议,默认为False(不启用)。
source与source_port参数作为指定查询源地址与端口,默认值为查询设备IP地址和0。
raise_on_no_answer参数用于指定当查询无应答时是否触发异常,默认为True。
举例
A记录
#!/usr/bin/env python
import dns.resolver
domain = input("please input an domain:")
A = dns.resolver.query(domain,'A')
for i in A.response.answer:
for j in i.items:
print(j.address)
测试结果:
(venv) ➜ dnspython python simple1.py
please input an domain:go2live.cn
59.110.85.65
MX记录
#!/usr/bin/env python
import dns.resolver
domain = input("please input an domain:")
MX = dns.resolver.query(domain, 'MX')
for i in MX:
print('MX preference=%s, mail exchanger=%s' % (i.preference, i.exchange))
测试结果:
(venv) ➜ dnspython python simple2.py
please input an domain:163.com
MX preference=10, mail exchanger=163mx02.mxmail.netease.com.
MX preference=10, mail exchanger=163mx03.mxmail.netease.com.
MX preference=10, mail exchanger=163mx01.mxmail.netease.com.
MX preference=50, mail exchanger=163mx00.mxmail.netease.com.
NS记录
#!/usr/bin/env python
import dns.resolver
domain = input("please input an domain:")
ns = dns.resolver.query(domain, 'NS')
for i in ns.response.answer:
for j in i.items:
print(j.to_text())
测试结果:
(venv) ➜ dnspython python simple3.py
please input an domain:baidu.com
ns4.baidu.com.
ns3.baidu.com.
ns7.baidu.com.
dns.baidu.com.
ns2.baidu.com.
需要注意,域名需要是一级域名。
CNAME记录
#!/usr/bin/env python
import dns.resolver
domain = input("please input an domain:")
cname = dns.resolver.query(domain, 'CNAME')
for i in cname.response.answer:
for j in i.items:
print(j.to_text())
测试结果:
(venv) ➜ dnspython python simple4.py
please input an domain:img.go2live.cn
iduxqy8.qiniudns.com.
我的网站把图片资源放到了七牛的dns上。。后面改到了阿里云。
监控代码
步骤:
1. 通过dns解析获得ip地址列表
2. 通过http请求获取网站服务是否正常。
#!/usr/bin/env python
import dns.resolver
import os
import requests
iplist = []
appdomain = "www.a.shifen.com"
def get_iplist(domain=""):
try:
A = dns.resolver.query(domain, 'A')
except Exception as e:
print("dns resolver error:", str(e))
return
for i in A.response.answer:
for j in i.items:
iplist.append(j.address)
return True
def checkip(ip):
checkurl = ip+":80"
try:
r = requests.get('http://'+checkurl)
if r.status_code == 200 and '<!doctype html>' in r.text.lower():
print(ip + " [ok]")
else:
print(ip + " [Error] ")
except Exception as e:
print(e)
if __name__ == '__main__':
if get_iplist(appdomain) and len(iplist) > 0:
for ip in iplist:
checkip(ip)
else:
print("dns resolver error.")
输出结果:
(venv) ➜ dnspython python simple5.py
58.217.200.112 [ok]
58.217.200.113 [ok]
域名不能用baidu.com, 因为baidu.com是www.a.shifen.com的别名。
也说明这个程序并不健壮。