我正在尝试启动并运行实际需要检查whois数据库的Web服务。我现在正在做的是丑陋的,我想尽可能地避免它:我调用gwhois命令并解析其输出。难看。
我做了一些搜索,试图找到一种pythonic方式来完成这项任务。通常我什么都没有 - this old discussion list link有办法检查域是否存在。不是我想要的......但是,谷歌给了我最好的东西 - 其他一切只是一堆未经批准的问题。
你们中的任何人都成功地启动并运行了一些方法吗?我非常感谢一些提示,或者我应该以开源方式,坐下来自己编写代码? :)
答案 0 :(得分:8)
看看这个: 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
...
答案 1 :(得分:6)
在我自己搜索python whois库的过程中发现了这个问题。
不知道我同意cdleary的答案,即使用包装的库 命令总是最好的方式 - 但我可以看出他说这个的原因。
Pro:cmd-line whois处理所有的辛苦工作(套接字调用,解析等)
骗局:不便携;模块可能无法工作,具体取决于底层whois命令。 更慢,因为除了whois命令之外还运行命令并且很可能是shell。 如果不是UNIX(Windows),不同的UNIX,旧的UNIX或 较旧的whois命令
我正在寻找一个可以处理whois IP查找的whois模块,我对编写自己的whois客户端不感兴趣。
以下是我(轻松)尝试的模块以及有关它的更多信息:
pywhoisapi:
BulkWhois
pywhois:
蟒-的whois:
whoisclient - python-whois的分支
更新:我最终使用pywhoisapi进行我正在进行的反向IP查找
答案 2 :(得分:5)
使用命令行实用程序来执行您想要的操作并没有错。如果你在服务周围放置一个漂亮的包装器,你可以实现你想要的内部结构!例如:
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滚动自己,绕过命令行实用程序(就像你正在做的那样),或者导入第三方库并使用它(如you're saying),这个界面仍然存在同样的。
这种方法通常不被认为是丑陋的 - 有时命令实用程序会按照您的需要执行操作,并且您应该能够利用它们。如果速度最终成为瓶颈,那么您的抽象使得切换到本机Python实现的过程对您的客户端代码是透明的。
Practicality beats purity - 这就是Pythonic。 :)
答案 3 :(得分:4)
这是在Python中重新实现的whois客户端: http://code.activestate.com/recipes/577364-whois-client/
答案 4 :(得分:1)
我不知道gwhois是否对服务器输出做了特别的事情;但是,您可以在端口whois(43)上明确连接到whois服务器,发送查询,读取回复中的所有数据并解析它们。为了使生活更轻松,您可以使用telnetlib.Telnet类(即使whois协议比telnet协议简单得多)而不是普通套接字。
棘手的部分:
答案 5 :(得分:0)
另一种方法是使用urllib2
模块来解析其他页面的whois服务(许多类似的网站都存在)。但这似乎更像是你现在做的黑客攻击,并且会让你依赖你所选择的任何网站,这很糟糕。
我不想这么说,但除非你想在程序中重新实现whois
(这将重新发明轮子),在操作系统上运行whois
并解析输出(即你现在正在做的事情)似乎是正确的做法。
答案 6 :(得分:0)
解析另一个网页不会那么糟糕(假设他们的HTML不是很糟糕),但实际上它会把我绑在他们身上 - 如果他们失败了,我就会失败:)
实际上我在sourceforge上发现了一些旧项目:rwhois.py。让我有点害怕的是他们的最后一次更新是从2003年开始的。但是,它似乎是一个开始重新实现我现在做的好地方......好吧,我觉得有必要发布这个项目的链接,无论如何,供进一步参考。
答案 7 :(得分:0)
import socket
socket.gethostbyname_ex('url.com')
如果它返回一个gaierror你知道它没有在任何DNS中注册
答案 8 :(得分:0)
这是一个随时可用的解决方案,对我有用;为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' ] )