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

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

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

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

    9 Solutions collect form web for “Какой способ Python вы бы предложили проверить записи базы данных whois?”

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

    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 

    Теперь, независимо от того, используете ли вы свой собственный urlib, оберните вокруг утилиты командной строки (например, вы делаете) или импортируете стороннюю библиотеку и используете ее (как вы говорите ), этот интерфейс остается прежним.

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

    Практичность превосходит чистоту – вот что такое Pythonic. 🙂

    Посмотрите на это: 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 ... 

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

    Не знаю, что я согласен с ответом 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 других РИР?

    BulkWhois

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

    pywhois:

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

    питон-Whois:

    • Домашняя страница: http://code.google.com/p/python-whois/
    • Дизайн: обертывает команду «whois»
    • Минусы: похоже, не обрабатывают запросы IP-адресов

    whoisclient – fork 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 вы спросите? RIPE, ARIN, APNIC, LACNIC, AFRINIC, JPNIC, VERIO и т. Д. LACNIC может быть полезным резервом, поскольку они склонны отвечать полезными данными на запросы за пределами своего домена.
    • каковы точные параметры и аргументы для каждого сервера whois? некоторые предлагают помощь, другие – нет. В общем, простые доменные имена работают без каких-либо специальных опций.

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

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

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

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

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

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

    вот готовое к использованию решение, которое работает для меня; написанный для Python 3.1 (при обратном переносе на Py2.x, обратите особое внимание на различия в байтах / Unicode). вашей единственной точкой доступа является метод DRWHO.whois() , который ожидает, что доменное имя будет передано; он попытается разрешить имя, используя провайдер, настроенный как DRWHO.whois_providers[ '*' ] (более полное решение может отличать поставщиков в соответствии с доменом верхнего уровня). DRWHO.whois() вернет словарь с одним text , который содержит текст ответа, отправленный сервером WHOIS. Опять же, более полное решение затем попытается проанализировать текст (который должен выполняться отдельно для каждого провайдера, так как нет стандартного формата) и вернуть более структурированный формат (например, установить флаг, который указывает, указывает ли домен смотрится). повеселись!

     ########################################################################## 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' ] ) 
    Python - лучший язык программирования в мире.