你建议用什么Python方法检查whois数据库记录?

11 投票
9 回答
24217 浏览
提问于 2025-04-11 09:25

我正在尝试搭建一个需要查询whois数据库的网络服务。目前我使用的方法很糟糕,我想尽量避免这种方式:我调用gwhois命令,然后解析它的输出。这实在太麻烦了。

我搜索了一下,想找一个更“Python风格”的方法来完成这个任务。结果发现几乎没有什么有用的信息——这个老讨论链接提到了一种检查域名是否存在的方法,但这并不是我想要的……不过,这也是谷歌给我的最好答案了,其他的都是一些没有答案的问题。

有没有人成功找到过什么方法可以用?我非常希望能得到一些建议,还是说我应该按照开源的方式,坐下来自己写点东西呢? :)

9 个回答

8

看看这个:

http://code.google.com/p/pywhois/

pywhois - 一个用来获取域名WHOIS信息的Python模块

目标:

  • 创建一个简单的Python模块,可以导入并生成指定域名的WHOIS数据。
  • 能够提取所有常见后缀(比如com、org、net等)的数据。
  • 直接查询WHOIS服务器,而不是像很多其他工具那样通过中间的网络服务。
  • 兼容Python 2.4及以上版本,并且不需要其他额外的依赖。

示例:

>>> import pywhois
>>> w = pywhois.whois('google.com')
>>> w.expiration_date
['14-sep-2011']
>>> w.emails
['contact-admin@google.com',
 'dns-admin@google.com',
 'dns-admin@google.com',
 'dns-admin@google.com']
>>> print w
...
11

在我寻找一个Python的whois库的过程中,发现了这个问题。

我不太同意cdleary的观点,认为使用一个封装了命令的库总是最佳选择,但我能理解他这么说的原因。

优点:命令行的whois可以处理所有复杂的工作(比如网络请求、解析等)。

缺点:不够灵活;这个模块可能会因为底层的whois命令不同而无法工作。运行命令的速度也比较慢,因为它需要同时运行whois命令和一个shell。如果不是UNIX系统(比如Windows),或者不同版本的UNIX,或者老旧的whois命令,都会受到影响。

我在寻找一个可以处理whois IP查询的模块,并且不想自己编写一个whois客户端。

以下是我(简单)尝试过的一些模块以及相关信息:

更新于2022年:我建议去pypi上搜索更新的whois库。 注意 - 有些API是特定于在线付费服务的。

pywhoisapi:

  • 主页:http://code.google.com/p/pywhoisapi/
  • 最后更新:2011年
  • 设计:REST客户端,访问ARIN的whois REST服务
  • 优点:能够处理IP地址查询
  • 缺点:能否从其他RIR的whois服务器获取信息?

BulkWhois:

pywhois:

  • 主页:http://code.google.com/p/pywhois/
  • 最后更新:2010年(没有找到分支)
  • 设计:REST客户端,访问RRID的whois服务
  • 优点:可以访问多个RRID;有Python 3.x的分支
  • 缺点:似乎不支持IP地址查询

python-whois(封装了whois命令):

whois:

whoisclient - python-whois的分支

  • 主页:http://gitorious.org/python-whois
  • 最后更新:(主页网站不再有效)
  • 设计:封装了"whois"命令
  • 依赖于:IPy.py
  • 缺点:似乎不支持IP地址查询

更新:我最终使用了pywhoisapi来进行我所做的反向IP查询。

7

使用命令行工具来完成你想做的事情没有任何问题。如果你给这个服务加上一个好看的外壳,你可以随意实现内部的逻辑!比如说:

class Whois(object):
    _whois_by_query_cache = {}

    def __init__(self, query):
        """Initializes the instance variables to defaults. See :meth:`lookup`
        for details on how to submit the query."""
        self.query = query
        self.domain = None
        # ... other fields.

    def lookup(self):
        """Submits the `whois` query and stores results internally."""
        # ... implementation

无论你是自己用urllib来实现,还是像你现在这样包裹一个命令行工具,或者引入一个第三方库来使用(就像你提到的),这个接口都是一样的。

这种做法一般来说并不算丑陋——有时候命令行工具正好能满足你的需求,你应该能够利用它们。如果速度成为了瓶颈,你的抽象层可以让切换到原生Python实现的过程对你的客户端代码来说是透明的。

实用性胜过纯粹性——这就是Python的风格。:)

撰写回答