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

4nkexdtk  于 2022-12-21  发布在  Python
关注(0)|答案(9)|浏览(83)

我正在试着让一个需要检查whois数据库的网络服务启动和运行。我现在做的事情很难看,我想尽可能避免它:我调用gwhois命令并解析它的输出。
我做了一些搜索,试图找到一个pythonic的方式来完成这项任务。一般来说,我得到了相当多的什么-this old discussion list link有一个方法来检查域是否存在。相当不是我所寻找的...但仍然,这是最好的anwser谷歌给我-其他一切都只是一堆unanwseed问题。
你们中有谁成功地启动并运行了某个方法吗?我非常感谢你们提供一些建议,或者我应该用开源的方式,坐下来自己编写一些代码吗?

jvlzgdj9

jvlzgdj91#

在我自己搜索python whois库的过程中发现了这个问题。
不知道我是否同意cdleary的回答,即使用一个 Package 命令的库总是最好的方法-但我可以看到他这么说的原因。
优点:cmd-line whois处理所有的困难工作(套接字调用、解析等)
缺点:不可携带;模块可能无法工作,具体取决于基础whois命令。速度较慢,因为除whois命令外还运行了命令和shell。如果不是UNIX(Windows)、不同的UNIX、较旧的UNIX或较旧的whois命令,则会受到影响
我正在寻找一个whois模块,可以处理whois的IP查找,我没有兴趣编码我自己的whois客户端。
以下是我(稍微)试用过的模块以及更多相关信息:

    • 我会在pypi上搜索更新的whois库。**注意-某些API特定于在线付费服务

皮沃伊萨皮:

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

批量Whois

皮沃伊斯:

  • 首页:http://code.google.com/p/pywhois/
  • 最后更新日期:2010(未找到分叉)
  • 设计:REST客户端访问RRID whois服务
  • 优点:访问许多RRID;具有python 3.x分支
  • 缺点:似乎不处理IP地址查找

python-whois( Package whois命令):

谁是:

whois客户端-python的叉-whois

  • 主页:http://gitorious.org/python-whois
  • 最后更新日期:(首页不再有效)
  • 设计: Package "whois"命令
  • Depends on: IPy.py
  • 缺点:似乎不处理IP地址查找

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

6ovsh4lw

6ovsh4lw2#

看看这个http://code.google.com/p/pywhois/
pywhois-用于检索域名的WHOIS信息的Python模块
目标:-创建一个简单的可导入的Python模块,它将为给定的域生成解析的WHOIS数据。-能够提取所有流行的顶级域名(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
...
eqqqjvef

eqqqjvef3#

使用命令行工具来做你想做的事情没有什么错。如果你在服务周围放一个漂亮的 Package 器,你就可以实现你想要的内部机制!例如:

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滚动自己的库、 Package 命令行实用程序(就像您正在做的那样),或者导入第三方库并使用它(就像您所说的那样),这个接口都保持不变。
这种方法通常一点也不难看--有时候命令实用程序做了你想做的事情,你应该能够利用它们.如果速度最终成为一个瓶颈,你的抽象使得切换到原生Python实现的过程对你的客户机代码是透明的。
Practicality beats purity--这就是Python语言。:)

vcudknz3

vcudknz35#

我不知道gwhois是否对服务器输出做了一些特殊的处理;然而,您可以直接连接到端口whois(43)上的whois服务器,发送您的查询,读取应答中的所有数据并解析它们。
棘手的部分:

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

wwwo4jvm6#

另一种方法是使用urllib2模块解析其他页面的whois服务(有许多类似的网站),但这看起来比你现在做的更像是一种黑客行为,会给予你依赖于你选择的whois网站,这是不好的。
我不想这么说,但是除非你想在你的程序中重新实现whois(这将是重新发明轮子),否则在操作系统上运行whois并解析输出(即你现在正在做的)似乎是正确的方法。

lf3rwulv

lf3rwulv7#

解析另一个网页不会那么糟糕(假设他们的html不会很糟糕),但它实际上会把我绑在他们身上-如果他们倒下了,我就倒下了:)
实际上我在sourceforge上找到了一些旧项目:让我有点害怕的是他们的最后一次更新是从2003年开始的。但是,这似乎是一个很好的地方开始重新实现我现在所做的事情...嗯,我觉得无论如何都有义务发布这个项目的链接,只是为了进一步参考。

q43xntqr

q43xntqr8#

这里有一个现成的解决方案,适合我;为Python 3.1编写(当向后移植到Py2.x时,要特别注意字节/ Unicode文本的区别)。您的单一访问点是方法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' ] )
v1l68za4

v1l68za49#

import socket
socket.gethostbyname_ex('url.com')

如果它返回一个gaireror,您知道它没有注册到任何DNS

相关问题