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地址有误")

posted @   逃离这世界~  阅读(9)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航