Какой способ Python вы бы предложили проверить в базе данных whois? - PullRequest
9 голосов
/ 08 сентября 2008

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

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

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

Ответы [ 9 ]

8 голосов
/ 02 ноября 2010

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

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

Цель: - Создать простой импортируемый модуль Python, который будет производить анализ данных WHOIS для данного домена. - Возможность извлечения данных для всех популярных TLD (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
...
6 голосов
/ 05 июля 2012

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

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

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

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

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

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

pywhoisapi:

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

BulkWhois

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

pywhois:

  • Дом: http://code.google.com/p/pywhois/
  • Дизайн: клиент REST, получающий доступ к службам Whois RRID
  • Плюсы: доступ ко многим RRID; имеет ветку python 3.x
  • Минусы: похоже, не обрабатывает поиск IP-адресов

питон-Whois:

whoisclient - форк python-whois

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

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

5 голосов
/ 11 сентября 2008

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

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. :)

4 голосов
/ 31 марта 2011

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

1 голос
/ 16 сентября 2008

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

Хитрые части:

  • какой сервер whois вы спросите? RIPE, ARIN, APNIC, LACNIC, AFRINIC, JPNIC, VERIO и т. Д. LACNIC может быть полезным запасным вариантом, поскольку они, как правило, отвечают полезными данными на запросы за пределами своего домена.
  • Каковы точные параметры и аргументы для каждого сервера whois? некоторые предлагают помощь, другие нет. Как правило, простые доменные имена работают без каких-либо специальных опций.
0 голосов
/ 09 марта 2010

вот готовое решение, которое работает для меня; написано для 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' ] )
0 голосов
/ 09 марта 2010
import socket
socket.gethostbyname_ex('url.com')

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

0 голосов
/ 08 сентября 2008

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

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

0 голосов
/ 08 сентября 2008

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

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

...