whois 데이터베이스 기록을 확인하기 위해 어떤 Python 방법을 제안하시겠습니까?

StackOverflow https://stackoverflow.com/questions/50394

  •  09-06-2019
  •  | 
  •  

문제

실제로 whois 데이터베이스를 확인해야 하는 웹 서비스를 시작하고 실행하려고 합니다.지금 내가 하고 있는 일은 추악하며 가능한 한 피하고 싶습니다.gwhois 명령을 호출하고 출력을 구문 분석합니다.못생긴.

나는 이 작업을 수행하는 Python적인 방법을 찾기 위해 몇 가지 검색을 수행했습니다.일반적으로 나는 아무것도 얻지 못했습니다. 이 오래된 토론 목록 링크 도메인이 존재하는지 확인하는 방법이 있습니다.내가 찾던 건 전혀 아니었는데...하지만 그래도 Google이 나에게 준 최고의 답변이었습니다. 다른 모든 것은 답이 없는 질문들일 뿐입니다.

여러분 중 어떤 방법을 시작하고 실행하는 데 성공한 사람이 있습니까?몇 가지 팁을 주시면 감사하겠습니다. 아니면 그냥 오픈 소스 방식으로 앉아서 직접 코딩해야 할까요?:)

도움이 되었습니까?

해결책

원하는 작업을 수행하기 위해 명령줄 유틸리티를 사용하는 데에는 아무런 문제가 없습니다.서비스 주위에 멋진 래퍼를 놓으면 원하는 대로 내부를 구현할 수 있습니다!예를 들어:

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입니다.:)

다른 팁

이거 봐요:http://code.google.com/p/pywhois/

pywhois - 도메인의 WHOIS 정보를 검색하기 위한 Python 모듈

목표:- 특정 도메인에 대해 구문 분석된 WHOIS 데이터를 생성하는 가져오기 가능한 간단한 Python 모듈을 만듭니다.- 모든 인기있는 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의 대답에 동의하는 것은 명령을 감싸는 라이브러리를 사용하는 것이 항상 가장 좋은 방법이라는 것에 동의하지만, 그가 말한 이유를 알 수 있습니다.

찬성:cmd-line whois는 모든 어려운 작업(소켓 호출, 구문 분석 등)을 처리합니다.

범죄자:휴대용이 아님;모듈은 기본 whois 명령에 따라 작동하지 않을 수 있습니다.whois 명령 외에 명령과 쉘을 실행하기 때문에 속도가 느려집니다.Unix (Windows), 다른 Unix, 오래된 유닉스 또는 오래된 Whois 명령이 아닌 경우 영향

나는 whois IP 조회를 처리할 수 있는 whois 모듈을 찾고 있지만 나만의 whois 클라이언트를 코딩하는 데는 관심이 없습니다.

다음은 제가 (약간) 시도해 본 모듈과 이에 대한 추가 정보입니다.

파이후이사피:

  • 집: http://code.google.com/p/pywhoisapi/
  • 설계:ARIN whois REST 서비스에 액세스하는 REST 클라이언트
  • 장점:IP 주소 조회를 처리할 수 있습니다.
  • 단점:다른 RIR의 whois 서버에서 정보를 가져올 수 있습니까?

벌크후이즈

  • 집: http://pypi.python.org/pypi/BulkWhois/0.2.1
  • 설계:RIR(?)에서 whois 텔넷 쿼리 인터페이스에 액세스하는 텔넷 클라이언트
  • 장점:IP 주소 조회를 처리할 수 있습니다.
  • 단점:다른 RIR의 whois 서버에서 정보를 가져올 수 있습니까?

파이후이즈:

  • 집: http://code.google.com/p/pywhois/
  • 설계:RRID whois 서비스에 액세스하는 REST 클라이언트
  • 장점:많은 RRID에 액세스합니다.Python 3.x 분기가 있습니다.
  • 단점:IP 주소 조회를 처리하지 않는 것 같습니다.

파이썬-후이즈:

whoisclient - python-whois의 포크

  • 집: http://gitorious.org/python-whois
  • 설계:"whois" 명령을 래핑합니다.
  • 다음에 따라 다릅니다.IPy.py
  • 단점:IP 주소 조회를 처리하지 않는 것 같습니다.

업데이트:나는 내가 하고 있던 역방향 IP 조회에 pywhoisapi를 사용하게 되었습니다.

다음은 Python으로 다시 구현된 whois 클라이언트입니다.http://code.activestate.com/recipes/577364-whois-client/

gwhois가 서버 출력에 특별한 작업을 수행하는지 여부는 알 수 없습니다.그러나 포트 whois(43)에서 whois 서버에 간단하게 연결하여 쿼리를 보내고 응답의 모든 데이터를 읽고 구문 분석할 수 있습니다.삶을 조금 더 쉽게 만들려면 일반 소켓 대신 telnetlib.Telnet 클래스(whois 프로토콜이 telnet 프로토콜보다 훨씬 간단하더라도)를 사용할 수 있습니다.

까다로운 부분:

  • 어느 누구 서버에 물어보실 건가요?RIPE, ARIN, APNIC, LACNIC, AFRINIC, JPNIC, VERIO 등 LACNIC는 도메인 외부 요청에 유용한 데이터로 응답하는 경향이 있으므로 유용한 대체 수단이 될 수 있습니다.
  • 각 whois 서버에 대한 정확한 옵션과 인수는 무엇입니까?일부는 도움을 제공하고 다른 일부는 그렇지 않습니다.일반적으로 일반 도메인 이름은 특별한 옵션 없이 작동합니다.

또 다른 방법은 다음을 사용하는 것입니다. urllib2 다른 페이지의 whois 서비스를 구문 분석하는 모듈입니다(이와 같은 사이트가 많이 존재합니다).하지만 그것은 지금 하는 일보다 훨씬 더 해킹에 가까운 것처럼 보이며, 선택한 모든 Whois 사이트에 종속되게 만드는 것은 나쁜 일입니다.

말하기 싫지만 다시 구현하고 싶지 않은 이상 whois (바퀴를 다시 발명하는) 프로그램에서 다음을 실행합니다. whois OS에서 출력을 구문 분석하는 것(즉, 지금 수행 중인 작업)을 수행하는 올바른 방법인 것 같습니다.

다른 웹페이지를 구문 분석하는 것은 그다지 나쁘지는 않을 것입니다(해당 HTML이 그다지 나쁘지 않을 것이라고 가정). 하지만 실제로는 저를 해당 웹페이지에 묶게 됩니다. 해당 웹페이지가 다운되면 저도 다운됩니다 :)

사실 나는 sourceforge에서 오래된 프로젝트를 발견했습니다. rwhois.py.가장 두려운 점은 마지막 업데이트가 2003년이라는 점입니다.하지만 지금 내가 하고 있는 일을 다시 구현하기 시작하는 것이 좋은 곳인 것처럼 보일 수도 있습니다.글쎄, 나는 단지 추가 참조를 위해 어쨌든 이 프로젝트에 대한 링크를 게시해야 한다고 느꼈습니다.

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

gaierror를 반환하면 DNS에 등록되지 않은 것입니다.

여기 저에게 딱 맞는 바로 사용 가능한 솔루션이 있습니다.Python 3.1용으로 작성되었습니다(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' ] )
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top