Какой способ Python вы бы предложили проверить записи базы данных whois?

Я пытаюсь запустить веб-сервис, который фактически требует проверки баз данных whois. То, что я сейчас делаю, уродливо, и я хотел бы избежать этого, насколько могу: я вызываю команду gwhois и анализирую ее вывод. Уродливый.

Я сделал некоторые поиски, чтобы попытаться найти питонический способ выполнить эту задачу. В общем, я ничего не получил ... --3-->этот старый список обсуждений ссылка есть способ проверить, существует ли домен. Совсем не то, что я искал... Но все же это было лучше всего. ответить мне выдал гугл, все остальное - просто куча unanwsered вопросы.

кому-нибудь из вас удалось запустить какой-то метод? Я был бы очень признателен за некоторые советы, или мне просто сделать это открытым способом, сесть и кодировать что-то самостоятельно? :)

9 ответов


нет ничего плохого в использовании утилиты командной строки, чтобы делать то, что вы хотите. Если вы поместите хорошую обертку вокруг службы, вы можете реализовать внутренние компоненты, как хотите! Например:

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, оберните утилиту командной строки (как вы это делаете) или импортируйте стороннюю библиотеку и используйте ее (например,ты говоришь), этот интерфейс останется прежним.

этот подход обычно не считается уродливым вообще ... --8-->иногда командные утилиты делают то, что вы хотите, и вы должны иметь возможность использовать их. Если скорость становится узким местом, ваша абстракция делает процесс перехода на собственную реализацию Python прозрачным для вашего клиентского кода.

практичность бьет чистоты -- вот что такое питон. :)


смотреть на это: http://code.google.com/p/pywhois/

pywhois-Python модуль для получения WHOIS информации доменов

цель: - Создайте простой импортируемый модуль 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
...

нашел этот вопрос в процессе моего собственного поиска библиотеки whois python.

Не знаю, что я согласен с ответом cdleary, что с помощью библиотеки, обертывания команда - всегда лучший способ уйти , но я вижу его причины, почему он это сказал.

Pro: cmd-line whois обрабатывает всю тяжелую работу (вызовы сокетов, синтаксический анализ и т. д.)

Con: не портативный; модуль может не работать в зависимости от базовой команды whois. Медленнее, так как выполняется команда и скорее всего shell в дополнение к команде whois. Влияет, если не UNIX (Windows), другой UNIX, более старый UNIX или старая команда whois

Я ищу модуль whois, который может обрабатывать whois IP-запросы, и я не заинтересован в кодировании моего собственного клиента whois.

вот модули, которые я (слегка) опробовал и больше информации об этом:

pywhoisapi:

  • домой: http://code.google.com/p/pywhoisapi/
  • Design: REST client доступ к ARIN whois REST service
  • Плюсы: возможность обработки IP-адресов
  • минусы: в состоянии вытащить информацию из whois серверов других RIRs?

BulkWhois

  • Главная:http://pypi.python.org/pypi/BulkWhois/0.2.1
  • дизайн: клиент telnet доступ к интерфейсу запроса whois telnet от Рир (?)
  • Плюсы: возможность обработки IP-адресов
  • минусы: в состоянии вытащить информацию из whois серверов других RIRs?

pywhois:

  • Главная:http://code.google.com/p/pywhois/
  • дизайн: клиент REST получает доступ к службам whois rrid
  • плюсы: Accessses многих RRIDs; имеет на Python 3.х филиал
  • минусы: похоже, не обрабатывает IP-адрес поиск

python-whois:

  • Главная:http://code.google.com/p/python-whois/
  • дизайн: обертывания "команды whois"
  • минусы: похоже, не обрабатывает поиск IP-адресов

whoisclient-вилка python-whois

  • Главная:http://gitorious.org/python-whois
  • дизайн: обертывания "команды whois"
  • зависит от: IPy.py
  • минусы: похоже, не обрабатывает поиск IP-адресов

обновление: я закончил использование pywhoisapi для обратного IP-поиска, который я делал


вот клиент whois, повторно реализованный в Python: http://code.activestate.com/recipes/577364-whois-client/


Я не знаю, делает ли gwhois что-то особенное с выходом сервера; однако вы можете просто подключиться к серверу whois на порту whois (43), отправить свой запрос, прочитать все данные в ответе и проанализировать их. Чтобы сделать жизнь немного проще, вы можете использовать telnetlib.Класс Telnet (даже если протокол whois намного проще, чем протокол telnet) вместо обычных сокетов.

хитрость:

  • какой whois сервер вы спросите? СПЕЛЫЕ, АРИН, ПАЛ, LACNIC, AFRINIC, JPNIC, VERIO и т. д. LACNIC может быть полезным резервным вариантом, поскольку они, как правило, отвечают полезными данными на запросы за пределами своего домена.
  • каковы точные параметры и аргументы для каждого whois-сервера? одни предлагают помощь, другие-нет. В общем, простые доменные имена работают без каких-либо специальных опций.

другой способ сделать это-использовать urllib2 модуль для анализа службы whois некоторых других страниц (многие подобные сайты существуют). Но это кажется еще более Хак, что то, что вы делаете сейчас, и даст вам зависимость от любого сайта whois, который вы выбрали, что плохо.

Я ненавижу это говорить, но если вы хотите повторно реализовать whois в вашей программе (которая будет повторно изобретать колесо) работает whois на ОС и разбор вывода (т. е. то, что вы делаете сейчас) кажется правильный способ сделать это.


разбор другой веб-страницы будет не так плохо (предполагая, что их html не будет очень плохим), но это на самом деле свяжет меня с ними - если они не работают, я не согласен :)

на самом деле я нашел старый проект на sourceforge:rwhois.py. Что меня немного пугает, так это то, что их последнее обновление с 2003 года. Но это может показаться хорошим местом, чтобы начать переосмысление того, что я делаю прямо сейчас... Ну, я чувствовал obligued постить в любом случае ссылку на этот проект, просто для дальнейшего ссылка.


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

если он возвращает gaierror, вы знаете, что он не зарегистрирован ни в одном DNS


вот готовое к использованию решение, которое работает для меня; написано для Python 3.1 (При backporting в Py2.x, уделяйте особое внимание различиям текста байтов / Юникода). ваша единственная точка доступа-это метод 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' ] )