Какой способ 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' ] )