你建议用什么Python方法检查whois数据库记录?
我正在尝试搭建一个需要查询whois数据库的网络服务。目前我使用的方法很糟糕,我想尽量避免这种方式:我调用gwhois命令,然后解析它的输出。这实在太麻烦了。
我搜索了一下,想找一个更“Python风格”的方法来完成这个任务。结果发现几乎没有什么有用的信息——这个老讨论链接提到了一种检查域名是否存在的方法,但这并不是我想要的……不过,这也是谷歌给我的最好答案了,其他的都是一些没有答案的问题。
有没有人成功找到过什么方法可以用?我非常希望能得到一些建议,还是说我应该按照开源的方式,坐下来自己写点东西呢? :)
9 个回答
看看这个:
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
...
在我寻找一个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:
- 主页:http://pypi.python.org/pypi/BulkWhois/0.2.1
- 最后更新:在2020年进行了分支https://github.com/deontpearson/BulkWhois
- 设计:telnet客户端,访问RIR的whois telnet查询接口
- 优点:能够处理IP地址查询
- 缺点:能否从其他RIR的whois服务器获取信息?
pywhois:
- 主页:http://code.google.com/p/pywhois/
- 最后更新:2010年(没有找到分支)
- 设计:REST客户端,访问RRID的whois服务
- 优点:可以访问多个RRID;有Python 3.x的分支
- 缺点:似乎不支持IP地址查询
python-whois(封装了whois命令):
- 主页:http://code.google.com/p/python-whois/
- 最后更新:2022年11月https://github.com/DannyCork/python-whois
- 设计:封装了"whois"命令
- 缺点:似乎不支持IP地址查询
whois:
- 主页:https://github.com/richardpenman/whois (https://pypi.org/project/python-whois/)
- 最后更新:2022年12月
- 设计:来自Apple的whois.c的移植
- 缺点:待定
whoisclient - python-whois的分支
- 主页:http://gitorious.org/python-whois
- 最后更新:(主页网站不再有效)
- 设计:封装了"whois"命令
- 依赖于:IPy.py
- 缺点:似乎不支持IP地址查询
更新:我最终使用了pywhoisapi来进行我所做的反向IP查询。
使用命令行工具来完成你想做的事情没有任何问题。如果你给这个服务加上一个好看的外壳,你可以随意实现内部的逻辑!比如说:
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的风格。:)