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

您建议用什么Python方法检查whois数据库记录?,python,sysadmin,whois,Python,Sysadmin,Whois,我正在尝试建立并运行一个Web服务,它实际上需要检查whois数据库。我现在所做的是丑陋的,我想尽量避免它:我调用gwhois命令并解析它的输出。丑陋的 我做了一些搜索,试图找到一种类似蟒蛇的方法来完成这项任务。一般来说,我什么都没得到——有办法检查域名是否存在。完全不是我想要的。。。但是,这仍然是谷歌给我的最好答案——其他一切都只是一堆未回答的问题 你们中有人成功地启动并运行了一些方法吗?我非常感谢一些提示,或者我应该用开源的方式,坐下来自己编写代码吗?:) 另一种方法是使用urllib2模块

我正在尝试建立并运行一个Web服务,它实际上需要检查whois数据库。我现在所做的是丑陋的,我想尽量避免它:我调用gwhois命令并解析它的输出。丑陋的

我做了一些搜索,试图找到一种类似蟒蛇的方法来完成这项任务。一般来说,我什么都没得到——有办法检查域名是否存在。完全不是我想要的。。。但是,这仍然是谷歌给我的最好答案——其他一切都只是一堆未回答的问题


你们中有人成功地启动并运行了一些方法吗?我非常感谢一些提示,或者我应该用开源的方式,坐下来自己编写代码吗?:)

另一种方法是使用
urllib2
模块解析其他页面的whois服务(存在许多类似的站点)。但这似乎比你现在所做的更像是一种黑客行为,会让你依赖于你选择的任何网站,这是不好的


我不想这么说,但除非你想在你的程序中重新实现
whois
(这将是重新发明轮子),在操作系统上运行
whois
,并解析输出(即你现在所做的)似乎是正确的方法。

解析另一个网页不会那么糟糕(假设他们的html不会很糟糕),但这实际上会把我和他们绑在一起——如果他们倒下了,我也倒下了:)


实际上,我在sourceforge上发现了一些旧项目:。让我有点害怕的是,他们的最后一次更新是从2003年开始的。但是,这似乎是一个开始重新实施我现在所做工作的好地方。。。无论如何,我觉得有义务发布这个项目的链接,只是为了进一步参考。

使用命令行实用程序做你想做的事情没有错。如果您在服务周围放置了一个很好的包装器,那么您可以根据需要实现内部构件!例如:

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实现的过程对客户端代码透明


--这就是蟒蛇的意思。:)

我不知道gwhois是否对服务器输出做了特殊处理;但是,您可以直接连接到端口whois(43)上的whois服务器,发送查询,读取回复中的所有数据并解析它们。为了让生活变得更简单,您可以使用telnetlib.Telnet类(即使whois协议比Telnet协议简单得多),而不是普通套接字

棘手的部分:

  • 你会问谁是服务器?RIME、ARIN、APNIC、LACNIC、AFRINIC、JPNIC、VERIO等LACNIC可能是一个有用的后备方案,因为它们倾向于用有用的数据回复其域外的请求
  • 每个whois服务器的确切选项和参数是什么?有些人提供帮助,有些人不提供。一般来说,普通域名不需要任何特殊选项

如果它返回一个GAI错误,您知道它没有在任何DNS上注册

这里有一个对我有用的现成解决方案;为Python3.1编写(在向后移植到Py2.x时,请特别注意字节/Unicode文本的区别)。您的单一访问点是方法
DRWHO.whois()
,该方法要求传入域名;然后,它将尝试使用配置为
DRWHO.whois\u providers['*']
的提供程序解析名称(更完整的解决方案可以根据顶级域区分提供程序)
DRWHO.whois()
将返回一个字典,其中包含whois服务器返回的响应文本。同样,一个更完整的解决方案将尝试解析文本(由于没有标准格式,必须对每个提供者分别进行解析),并返回一个更结构化的格式(例如,设置一个标志
available
,指定域是否看起来可用)。玩得开心

##########################################################################
import asyncore as                                   _sys_asyncore
from asyncore import loop as                         _sys_asyncore_loop
import socket as                                     _sys_socket



##########################################################################
class _Whois_request( _sys_asyncore.dispatcher_with_send, object ):
  # simple whois requester
  # original code by Frederik Lundh

  #-----------------------------------------------------------------------
  whoisPort = 43

  #-----------------------------------------------------------------------
  def __init__(self, consumer, host, provider ):
    _sys_asyncore.dispatcher_with_send.__init__(self)
    self.consumer = consumer
    self.query    = host
    self.create_socket( _sys_socket.AF_INET, _sys_socket.SOCK_STREAM )
    self.connect( ( provider, self.whoisPort, ) )

  #-----------------------------------------------------------------------
  def handle_connect(self):
    self.send( bytes( '%s\r\n' % ( self.query, ), 'utf-8' ) )

  #-----------------------------------------------------------------------
  def handle_expt(self):
    self.close() # connection failed, shutdown
    self.consumer.abort()

  #-----------------------------------------------------------------------
  def handle_read(self):
    # get data from server
    self.consumer.feed( self.recv( 2048 ) )

  #-----------------------------------------------------------------------
  def handle_close(self):
    self.close()
    self.consumer.close()


##########################################################################
class _Whois_consumer( object ):
  # original code by Frederik Lundh

  #-----------------------------------------------------------------------
  def __init__( self, host, provider, result ):
    self.texts_as_bytes = []
    self.host           = host
    self.provider       = provider
    self.result         = result

  #-----------------------------------------------------------------------
  def feed( self, text ):
    self.texts_as_bytes.append( text.strip() )

  #-----------------------------------------------------------------------
  def abort(self):
    del self.texts_as_bytes[:]
    self.finalize()

  #-----------------------------------------------------------------------
  def close(self):
    self.finalize()

  #-----------------------------------------------------------------------
  def finalize( self ):
    # join bytestrings and decode them (witha a guessed encoding):
    text_as_bytes         = b'\n'.join( self.texts_as_bytes )
    self.result[ 'text' ] = text_as_bytes.decode( 'utf-8' )


##########################################################################
class DRWHO:

  #-----------------------------------------------------------------------
  whois_providers = {
    '~isa':   'DRWHO/whois-providers',
    '*':      'whois.opensrs.net', }

  #-----------------------------------------------------------------------
  def whois( self, domain ):
    R         = {}
    provider  = self._get_whois_provider( '*' )
    self._fetch_whois( provider, domain, R )
    return R

  #-----------------------------------------------------------------------
  def _get_whois_provider( self, top_level_domain ):
    providers = self.whois_providers
    R         = providers.get( top_level_domain, None )
    if R is None:
      R = providers[ '*' ]
    return R

  #-----------------------------------------------------------------------
  def _fetch_whois( self, provider, domain, pod ):
    #.....................................................................
    consumer  = _Whois_consumer(           domain, provider, pod )
    request   = _Whois_request(  consumer, domain, provider )
    #.....................................................................
    _sys_asyncore_loop() # loops until requests have been processed


#=========================================================================
DRWHO = DRWHO()


domain    = 'example.com'
whois     = DRWHO.whois( domain )
print( whois[ 'text' ] )
看看这个:

pywhois-用于检索域的WHOIS信息的Python模块

目标: -创建一个简单的可导入Python模块,该模块将生成给定域的已解析WHOIS数据。 -能够提取所有常用TLD(com、org、net等)的数据 -直接查询WHOIS服务器,而不是像许多其他服务器一样通过中间web服务。 -可与Python2.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客户端:

在我自己搜索python whois库的过程中发现了这个问题

我不知道我是否同意cdleary的答案,即使用一个 命令永远是最好的方式,但我能理解他为什么这么说

Pro:cmd行whois处理所有繁重的工作(套接字调用、解析等)

缺点:不便于携带;根据基础whois命令,模块可能无法工作。 速度较慢,因为除了whois命令外,还运行命令和最可能的shell。 如果不是UNIX(Windows)、不同的UNIX、旧的UNIX或 老whois命令

我正在寻找一个whois模块,可以处理whois IP查找,我对编写自己的whois客户端不感兴趣

以下是我(轻松地)试用过的模块以及有关它的更多信息:

皮维萨皮:

  • 主页:
  • 设计:REST客户端访问ARIN whois REST服务
  • 优点:能够处理IP地址查找
  • 缺点:能够从其他RIR的whois服务器中提取信息
庞然大物

  • 主页:
  • 设计:telnet客户端访问whois telnet查询int
    >>> 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
    ...