1. 程式人生 > 實用技巧 >python3 批量查詢域名A記錄 & CNAME

python3 批量查詢域名A記錄 & CNAME

場景:需要批量查詢域名資訊

需要生成一個 domain_in.txt的檔案
檔案內容格式(尾行不可有空行):

baidu.com
bilibili.com

程式碼

import random
import string
from dns.resolver import Resolver
import requests
import socket
from parsel import Selector

"""
# python3
pip install dnspython3
pip install lxml
pip install requests
pip install parsel
"""

dns_resolver = Resolver()
dns_resolver.nameservers = ["8.8.8.8", "8.8.4.4"]


def get_ip_from_domain(domain):
    domain = domain.lower().strip()
    try:
        return dns_resolver.query(domain, 'CNAME')[0].to_text()
    except Exception:
        return str(None)


def open_domainlist(filename):
    with open(filename, encoding="utf-8") as f:
        return f.readlines()


def get_whoisname(domainwhois):
    requests_data = {
        "domain": str(domainwhois),
        "type": 'true',
        "standard": 'true'
    }
    url = 'https://api.devopsclub.cn/api/whoisquery'
    get_whoisnames = requests.get(url=url, params=requests_data).json()
    return get_whoisnames


def for_domainlist(domainnamess):
    for domain_one in domainnamess:
        # 組合
        domain_one_n = domain_one.strip('\n')
        www_domain = 'www' + '.' + domain_one_n
        # 列印
        print(domain_one_n + ' 域名解析檢查: ')
        whois_xpath(domain_one_n)
        get_domain_ip(domain_one_n)
        get_domain_or_ip('www', domain_one_n)
        print(www_domain + ' CNAME = ' + get_ip_from_domain(www_domain))
        print('-' * 30)


def whois_xpath(whois_name):
    # 獲取返回響應的html檔案
    url = 'https://who.is/whois/' + whois_name

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/84.0.4147.125 Safari/537.36 Edg/84.0.522.61'
    }
    selector = Selector(text=requests.post(url=url, headers=headers, timeout=600).text)
    select_url = selector.xpath('/html/body/div[3]/div[2]/div[5]/div[1]/div[3]/div/div[3]/div[2]/text()').extract_first()
    print(select_url)


def get_domain_ip(domain):
    try:
        myaddr = socket.getaddrinfo(domain, 'http')
        print('頂級域名解析值: ' + domain + ' = ' + myaddr[0][4][0])
    except Exception:
        print('頂級域名解析不存在')


def get_domain_or_ip(a, domain):
    try:
        domain_sub = a + '.' + domain
        myaddr = socket.getaddrinfo(domain_sub, 'http')
        print(domain_sub + ' = ' + myaddr[0][4][0])
    except Exception:
        print('解析' + a + '不存在')


if __name__ == '__main__':
    # input('確認相對路徑存在 domain_in.txt /  <Enter>')
    DomainNames = open_domainlist('domain_in.txt')
    for_domainlist(DomainNames)
    # input('Press <Enter>')