如何在 python 中测试域是“www”域或子域或名称服务器域或邮件域?

Posted

技术标签:

【中文标题】如何在 python 中测试域是“www”域或子域或名称服务器域或邮件域?【英文标题】:How to test Domain is it 'www' domain or subdomain or name server domain or mail domain in python? 【发布时间】:2014-12-31 08:12:19 【问题描述】:

我有我要测试的域列表,它们是主域还是子域或名称服务器或邮件服务器:

www.domain.com ns1.domain.com mail.domain.com community.domain.com mx.domain.com mx3.domain.com aspmx.l.google.com forums.domain.com

我使用了tldextract python 库

    from tld import get_tld
    import tldextract

    class DomainOpt(object):
    """docstring for DomainOpt"""
    _domainname = ''
    _tldextract = None
    _domaintype = ''

        def __init__(self, domainname):
            super(DomainOpt, self).__init__()
            self._domainname = domainname
            self._tldextract = tldextract.extract("http://%s/" % self._domainname)
            if self._tldextract.subdomain == 'mail':
                self._domaintype = 'maildomain'
            elif self._tldextract.subdomain in ['ns1','ns2','ns3','ns4','ns5','ns6',
            'ns7','ns8','ns9','ns10','ns11','ns12','ns13','ns14', 'ns15', 'ns16']:
                self._domaintype = 'dnsdomain'
            elif self._tldextract.subdomain is not None:
                self._domaintype = 'subdomain'
            else:
                self._domaintype = 'domain'

        @property
        def domainname(self):
            return get_tld(str('http://%s/' % self._domainname), fail_silently=True)

        @property
        def domain(self):
            return self._tldextract.domain
        @property
        def subdomain(self):
            return self._tldextract.subdomain
        @property
        def suffix(self):
            return self._tldextract.suffix
        @property
        def domaintype(self):
            return self._domaintype

【问题讨论】:

它没有做什么?你遇到了什么错误? 此列表中有多种名称服务器,但如何区分邮件域和名称服务器以及子域的问题 域类型总是错误或错误 您是否考虑过检查 DNS?在 DNS 中查询 example.com 的 NS 和 MX 记录,然后查看您拥有的内容是否与实时记录名称匹配。 DNSPython 是一个可以帮助做到这一点的库。 【参考方案1】:

试试这个:

hostList = [
    'www.domain.com',
    'ns1.domain.com',
    'mail.domain.com',
    'community.domain.com',
    'mx.domain.com',
    'mx3.domain.com',
    'aspmx.l.google.com',
    'forums.domain.com'
    ]

for h in hostList:
    splitHost = h.split('.')
    tld = splitHost.pop()
    dom = splitHost.pop()
    host = '.'.join(splitHost)
    print 'FQHN: : ', h
    print 'Host  : ', host
    print 'Domain: ', dom
    print 'TLD   : ', tld
    print

另请注意,这仅适用于“简单”TLD,例如 comnetorg 等。

【讨论】:

这很有用,谢谢,但我想区分'mx3'或'mx'是用于子域或邮件域,'ns12'和'aspmx.l'是邮件域,子- 域或名称服务器?是否有任何库或脚本可以区分? @JonB 您会假设 FQHN 实际上反映了主机的目的。例如,如果我将我的邮件服务器命名为george.example.com,你能区分它的用途吗?而且,是的,它们就在那里。 您可以尝试使用nmap 来查找打开的端口并猜测主机的用途,但对于提供多种服务的主机而言,它并非 100% 准确。【参考方案2】:

tldextract 库的作用与您的需要相反:给定字符串“mail.example.com”,它将返回“com”而不是“mail”。做你需要的,你不需要任何库;只需在域名中搜索“。”并取其前面的子字符串。

【讨论】:

以上是关于如何在 python 中测试域是“www”域或子域或名称服务器域或邮件域?的主要内容,如果未能解决你的问题,请参考以下文章

动态子域 PHP

Python变量作用域

跨子域 iframe 和 JavaScript

Selenium3自动化测试31Cookie处理

symfony 应用程序与域/子域共享登录 cookie

所有子域的 Symfony2 会话