Какой способ Python вы бы предложили проверить в базе данных whois?
Я пытаюсь запустить и запустить веб-сервис, который фактически требует проверки баз данных whois. То, что я делаю сейчас, ужасно, и я бы хотел избежать этого как можно больше: я вызываю команду gwhois и анализирую ее вывод. Некрасиво.
Я попытался найти питонский способ решения этой задачи. Обычно я ничего не получил - эта старая ссылка на список обсуждений может проверить, существует ли домен. Совсем не то, что я искал... Но, тем не менее, это был лучший ответ, который Google дал мне - все остальное - просто куча незапрашиваемых вопросов.
Кому-нибудь из вас удалось запустить какой-нибудь метод? Я был бы очень признателен за некоторые советы, или я должен просто сделать это с открытым исходным кодом, сесть и написать что-нибудь сам?:)
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, оберните вокруг утилиту командной строки (как вы делаете) или импортируете стороннюю библиотеку и используете ее (как вы говорите), этот интерфейс остается прежним.
Такой подход вообще не считается уродливым - иногда командные утилиты делают то, что вы хотите, и вы должны иметь возможность использовать их. Если скорость оказывается узким местом, ваша абстракция делает процесс перехода к собственной реализации Python прозрачным для вашего клиентского кода.
Практичность побеждает чистоту - вот что такое Pythonic.:)
Нашел этот вопрос в процессе собственного поиска библиотеки whois для python.
Не знаю, согласен ли я с ответом cdleary о том, что использование библиотеки, заключающей в себе команду, всегда лучший путь, но я вижу причины, по которым он сказал это.
Pro: cmd-line whois выполняет всю тяжелую работу (вызовы сокетов, анализ и т. Д.)
Минус: не портативный; модуль может не работать в зависимости от базовой команды 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:
- Главная страница: http://code.google.com/p/python-whois/
- Дизайн: переносит команду whois
- Минусы: не похоже на поиск IP-адресов
whoisclient - форк python-whois
- Домашняя страница: http://gitorious.org/python-whois
- Дизайн: переносит команду whois
- Зависит от: IPy.py
- Минусы: не похоже на поиск IP-адресов
Обновление: я закончил тем, что использовал pywhoisapi для обратного поиска IP, который я делал
Посмотрите на это: 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
...
Вот клиент 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
в ОС и синтаксический анализ вывода (то есть то, что вы делаете сейчас) кажется правильным способом сделать это.
Разбор другой веб-страницы не будет таким плохим (при условии, что их html-файл не будет очень плохим), но на самом деле это свяжет меня с ними - если они не работают, я опущен:)
На самом деле я нашел какой-то старый проект на sourceforge: rwhois.py. Что меня пугает, так это то, что их последнее обновление относится к 2003 году. Но, может показаться, что это хорошее место, чтобы начать переосмысление того, что я делаю прямо сейчас... Ну, я чувствовал себя обязанным в любом случае опубликовать ссылку на этот проект, просто для дальнейшего использования.
Вот готовое решение, которое работает для меня; написано для 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' ] )
import socket
socket.gethostbyname_ex('url.com')
если он возвращает gaierror, вы знаете, что он не зарегистрирован ни на одном DNS