16. python dnspython模块
16. dnspython
- dnspython提供了大量的DNS处理方法,最常用的方法是域名查询。
- dnspython提供了一个DNS解析器类------resolver,使用它的query方法来实现域名的查询功能。
- A记录,将主机名转换为IP地址;
- MX记录,邮件交换记录,定义邮件服务器的域名;
- CNAME记录,指别名记录,实现域名间的映射;
- NS记录,标记区域的域名服务器及授权子域;
- PTR记录,反向解析,与A记录相反,将IP转换为主机名;
- SOA记录,SOA标记,一个起始授权区的定义。
1) A记录,将主机名转换为IP地址;
#!/usr/bin/python3
#_*_coding:utf-8_*_
import dns.resolver
domain = input('请输入域名:')
A = dns.resolver.query(domain,'A') #指定的查询类型为A记录
for i in A.response.answer: #通过response.answer方法获取查询回应信息
for j in i.items: #遍历回应信息
print(j)
2) MX记录,邮件交换记录,定义邮件服务器的域名;
#!/usr/bin/python3
#_*_coding:utf-8_*_
import dns.resolver
domain = input('请输入域名:')
MX = dns.resolver.query(domain,'MX') #指定的查询类型为MX记录
for i in MX:
print(f'MX preference: {i.preference} mail exchange: {i.exchange}')
3) CNAME记录,指别名记录,实现域名间的映射;
#!/usr/bin/python3
#_*_coding:utf-8_*_
import dns.resolver
domain = input('请输入域名:')
cname = dns.resolver.query(domain,'CNAME') #指定的查询类型为CNAME记录
for i in cname.response.answer: #通过response.answer方法获取查询回应信息
for j in i.items: #遍历回应信息
print(j.to_text())
4) NS记录,标记区域的域名服务器及授权子域;
#!/usr/bin/python3
#_*_coding:utf-8_*_
import dns.resolver
domain = input('请输入域名:')
NS = dns.resolver.query(domain,'CNAME') #指定的查询类型为NS记录
for i in NS.response.answer: #通过response.answer方法获取查询回应信息
for j in i.items: #遍历回应信息
print(j.to_text())
一个简单的示例:
#!/usr/bin/python3
#_*_coding:utf-8_*_
"""
代码思路:
1. 获取有效IP列表
获取记录类型
将获取的值添加到列表中
2. 对IP列表里面的值进行检测
创建IP地址的连接
尝试发起请求
对请求的响应内容进行判断,并输出结果
3. 测试主程序
先获取IP列表,然后对IP进行测试
"""
import dns.resolver
import http.client
import re
# 准备工作
iplist = [] #定义域名IP列表
appdomain = 'www.baidu.com' #定义业务域名
# 判断解析的数据是不是IP
def is_ipv4(ip):
# 使用正则表达式检查是否为IPv4地址
pattern = r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
return re.match(pattern, ip) is not None
def get_iplist(domain=""):
try:
dns_type = 'A'
ip_result = dns.resolver.resolve(domain, dns_type)
except Exception as e:
print("dns解析失败:{}".format(str(e)))
return False
# 将获取的值添加到列表中
for rdata in ip_result:
if is_ipv4(rdata.address): #要判断是不是IP需要 加上address
iplist.append(rdata.address)
# print(type(rdata)) #<class 'dns.rdtypes.IN.A.A'>
# print(type(rdata.address)) #<class 'str'>
return True
def checkip(ip):
conn = http.client.HTTPConnection(ip, port=80, timeout=10)
try:
conn.request("GET", "/", headers={"Host": appdomain})
response = conn.getresponse()
if response.status == 200:
first_bytes = response.read(6)
if first_bytes.startswith(b"<html>") or first_bytes.startswith(b"<!DOCT"):
print("{} 状态: Ok".format(ip))
else:
print("{} 状态: 可能不是HTML内容".format(ip))
else:
print("{} 状态码: {}".format(ip, response.status))
except Exception as e:
print("网络超时或者地址访问异常,请重试: {}".format(str(e)))
finally:
conn.close()
# 测试主程序
if __name__ == '__main__':
if get_iplist(appdomain) and len(iplist) > 0:
for ip in iplist:
# print("{} 的正常解析IP有: {}".format(appdomain,ip))
checkip(ip)
else:
print("dns 解析后的IP地址有误")
合集:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通