客观的

我需要一种可靠方式来在Python中检查是否已注册或可用任何TLD 的域。粗体的短语是我一直在努力的重点。

我尝试了什么?

  • WHOIS 是进行检查的明显方法,而我现有的Python库(例如流行的 python-whois )是我的第一次尝试。问题在于,它似乎无法检索某些TLD的信息,例如.run,尽管它对于较旧的版本大多数情况下都很好用,例如.com。
  • 因此,如果python-whois不可靠,也许仅使用Linux的whois 包装器会更好。我尝试了 whois library ,但不幸的是,它仅支持有限的一组TLD,显然是为了确保它始终可以解析结果。
  • 因为我真的不需要解析结果,所以我从whois库中剥离了代码,并尝试通过自己查询Linux的whois 来执行查询:
    p = subprocess.Popen(['whois', 'example.com'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    r = p.communicate()[0]
    print(r.decode())
    

    效果更好。除了之外,也不那么可靠。我尝试了一个特定的域,并收到“超出了您的连接限制。请放慢速度,然后重试。”好吧,超出限制的不是我。在庞大的办公室中使用单个IP意味着在我进行查询之前,其他人可能会达到极限。
  • 另一个想法是,不要使用WHOIS ,而是进行DNS查找。但是,我需要处理过期后注册的或处于保护阶段且没有DNS记录的域,因此这显然是不可能的。
  • 最后一个想法是通过某些第三方服务 API进行查询。问题在于对这些服务的信任,因为它们可能会snatch我检查过的可用域。

  • 类似问题

    已经有类似的问题:
  • a stable way to check domain availability with pywhois
  • Testing domain-name availability with pythonwhois

  • ...但是它们要么只处理一组有限的TLD,要么不受可靠性的困扰。

    最佳答案

    如果您没有特定的访问权限(例如成为注册商),并且没有针对特定的TLD(因为某些TLD确实具有称为域可用性的特定公共(public)服务),那么唯一有意义的工具是查询whois服务器。

    然后,您至少会遇到以下两个问题:

  • 根据给定的域名
  • 使用适当的whois服务器
  • 考虑到whois服务器是受速率限制的,因此如果您不小心批量查询它们,您将首先遇到延迟,甚至冒一段时间将您的IP列入黑名单的风险。

  • 第二点,采用通常的方法(处理您方面的延迟,使用多个端点等)。

    对于第一点,在我的另一封答复中:https://unix.stackexchange.com/a/407030/211833,您可以根据所使用的whois周围的包装以及一些对策找到一些有关所观察到内容的解释。另请参阅我的其他回复:https://webmasters.stackexchange.com/a/111639/75842和具体指向
    2。

    请注意,根据您的特定要求,如果您至少能够更改其中的一部分,则可能会有其他解决方案。例如,对于通用顶级域名(gTLD),如果您允许24小时的延迟,则可以使用已发布的注册表区域文件来查找已注册的域名(已发布的域名并不是全部)。

    同样,从一般意义上说,为什么使用第三方有其弱点是对的,如果您找到了一个有值(value)的注册服务商,既可以访问许多注册管理机构,又可以为您提供API,则可以将其用于您的需求。

    简而言之,我不相信您可以在所有情况下(100%可靠性,100%TLD等)来完成此任务。您将需要一些折衷,但是它们取决于您的最初需求。

    同样非常重要:不要掏空运行whois命令,这会带来许多安全性和性能问题。使用您的编程语言中的适当库来进行whois查询,或者只是在端口43上打开TCP套接字,然后在以CR + LF终止的一行上发送查询,回读一小段文本,这基本上只是RFC3912中定义的内容。

    关于python - 如何可靠地检查域是否已注册或可用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48063176/

    10-12 23:09