9

我正在尝试启动并运行实际上需要检查 whois 数据库的 Web 服务。我现在正在做的事情很丑陋,我想尽可能地避免它:我调用 gwhois 命令并解析它的输出。丑陋。

我做了一些搜索,试图找到一种 Python 的方式来完成这项任务。一般来说,我什么都没得到——这个旧的讨论列表链接有一种方法可以检查域是否存在。完全不是我想要的......但是,它仍然是谷歌给我的最好的答案 - 其他一切都只是一堆 unanwsered 的问题。

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

4

9 回答 9

8

看看这个: http ://code.google.com/p/pywhois/

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

目标: - 创建一个简单的可导入 Python 模块,该模块将为给定域生成解析后的 WHOIS 数据。- 能够为所有流行的 TLD(com、org、net、...)提取数据 - 直接查询 WHOIS 服务器,而不是像许多其他人那样通过中间 Web 服务。- 适用于 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
...
于 2010-11-02T13:53:05.607 回答
8

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

不知道我同意 cdleary 的回答,即使用包装命令的库始终是最好的方法 - 但我可以看到他这么说的原因。

优点: cmd-line whois 处理所有繁重的工作(套接字调用、解析等)

缺点:不便携;模块可能无法工作,具体取决于底层 whois 命令。速度较慢,因为除了 whois 命令之外还运行命令和最有可能的 shell。如果不是 UNIX (Windows)、不同的 UNIX、较旧的 UNIX 或较旧的 whois 命令,则受影响

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

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

pywhoisapi:

  • 主页:http ://code.google.com/p/pywhoisapi/
  • 设计:REST客户端访问ARIN whois REST服务
  • 优点:能够处理 IP 地址查找
  • 缺点:能够从其他 RIR 的 whois 服务器中提取信息?

BulkWhois

  • 主页: http: //pypi.python.org/pypi/BulkWhois/0.2.1
  • 设计:telnet 客户端从 RIR(?) 访问 whois telnet 查询接口
  • 优点:能够处理 IP 地址查找
  • 缺点:能够从其他 RIR 的 whois 服务器中提取信息?

pywhois:

  • 主页:http ://code.google.com/p/pywhois/
  • 设计:REST 客户端访问 RRID whois 服务
  • 优点:访问许多 RRID;有 python 3.x 分支
  • 缺点:似乎不处理 IP 地址查找

蟒蛇whois:

whoisclient - python-whois 的分支

更新:我最终使用 pywhoisapi 进行反向 IP 查找

于 2012-07-05T12:03:17.293 回答
6

使用命令行实用程序来做你想做的事没有错。如果你在服务周围放置了一个很好的包装器,你可以随心所欲地实现内部!例如:

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

实用胜过纯洁——这就是 Pythonic。:)

于 2008-09-10T21:44:53.197 回答
4

这是用 Python 重新实现的 whois 客户端:http: //code.activestate.com/recipes/577364-whois-client/

于 2011-03-31T00:37:11.253 回答
1

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

棘手的部分:

  • 你会问哪个whois服务器?RIPE、ARIN、APNIC、LACNIC、AFRINIC、JPNIC、VERIO 等 LACNIC 可能是一个有用的后备方案,因为它们倾向于用有用的数据回复其域外的请求。
  • 每个 whois 服务器的确切选项和参数是什么?有些提供帮助,有些则不提供。通常,纯域名无需任何特殊选项即可使用。
于 2008-09-16T00:23:53.210 回答
0

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

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

于 2008-09-08T18:53:37.990 回答
0

解析另一个网页不会那么糟糕(假设他们的 html 不会很糟糕),但它实际上会将我与他们联系起来——如果他们失败了,我就失败了 :)

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

于 2008-09-08T19:00:58.957 回答
0
import socket
socket.gethostbyname_ex('url.com')

如果它返回一个 gaierror 你知道它没有在任何 DNS 上注册

于 2010-03-09T10:07:39.447 回答
0

这是一个适合我的即用型解决方案;为 Python 3.1 编写(向后移植到 Py2.x 时,请特别注意字节/Unicode 文本的区别)。您的单点访问是 method DRWHO.whois(),它需要传入一个域名;然后它将尝试使用配置为的提供者解析名称DRWHO.whois_providers[ '*' ](更完整的解决方案可以根据顶级域区分提供者)。DRWHO.whois()将返回带有单个条目的字典text,其中包含 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' ] )
于 2010-03-09T16:17:23.993 回答