9

実際にwhoisデータベースをチェックする必要があるWebサービスを稼働させようとしています。私が今していることは醜いので、できるだけ避けたいと思います。gwhoisコマンドを呼び出して、その出力を解析します。ぶさいくな。

私はこのタスクを実行するためのpythonicな方法を見つけるためにいくつかの検索を行いました。一般的に、私はほとんど何も得られませんでした-この古いディスカッションリストのリンクには、ドメインが存在するかどうかを確認する方法があります。私が探していたものとはまったく異なります...しかし、それでも、Googleが私にくれたのは最高の答えでした。他のすべては、答えのない質問の集まりにすぎません。

いくつかのメソッドを起動して実行することに成功した人はいますか?いくつかのヒントをいただければ幸いです。それとも、オープンソースの方法で、座って自分で何かをコーディングする必要がありますか?:)

4

9 に答える 9

8

python whois ライブラリを自分で検索する過程で、この質問を見つけました。

コマンドをラップするライブラリを使用することが常に最善の方法であるというcdlearyの答えに同意するかどうかはわかりませんが、彼がこれを言った理由はわかります。

長所: cmd-line whois がすべてのハードワーク (ソケット呼び出し、解析など) を処理します。

短所:ポータブルではありません。モジュールは、基になる whois コマンドによっては機能しない場合があります。whoisコマンドに加えてコマンドとおそらくシェルを実行するため、遅くなります。UNIX (Windows)、別の UNIX、古い UNIX、または古い whois コマンドではない場合に影響を受ける

whois IP ルックアップを処理できる whois モジュールを探していますが、独自の whois クライアントのコーディングには興味がありません。

私が(軽く)試したモジュールとそれに関する詳細情報は次のとおりです。

pywhoisapi:

  • ホーム: http://code.google.com/p/pywhoisapi/
  • 設計: ARIN whois REST サービスにアクセスする REST クライアント
  • 長所: IP アドレス ルックアップを処理できる
  • 短所: 他の RIR の whois サーバーから情報を取得できますか?

バルクホイス

  • ホーム: http://pypi.python.org/pypi/BulkWhois/0.2.1
  • 設計: RIR から whois telnet クエリ インターフェイスにアクセスする telnet クライアント(?)
  • 長所: IP アドレス ルックアップを処理できる
  • 短所: 他の RIR の whois サーバーから情報を取得できますか?

pywhois:

  • ホーム: http://code.google.com/p/pywhois/
  • 設計: RRID whois サービスにアクセスする REST クライアント
  • 長所: 多くの RRID にアクセスできます。Python 3.x ブランチがあります
  • 短所: IP アドレスのルックアップを処理していないようです

python-whois:

whoisclient - python-whois のフォーク

  • ホーム: http://gitorious.org/python-whois
  • 設計: 「whois」コマンドをラップ
  • 依存: IPy.py
  • 短所: IP アドレスのルックアップを処理していないようです

更新:私が行っていた逆IPルックアップにpywhoisapiを使用することになりました

于 2012-07-05T12:03:17.293 に答える
8

これを見てください: http://code.google.com/p/pywhois/

pywhois - ドメインの WHOIS 情報を取得するための Python モジュール

目標: - 特定のドメインの解析済み WHOIS データを生成する、単純なインポート可能な Python モジュールを作成します。- すべての一般的な TLD (com、org、net など) のデータを抽出することができます。- 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
...
于 2010-11-02T13:53:05.607 に答える
6

コマンド ライン ユーティリティを使用して目的の操作を行うことに問題はありません。サービスに適切なラッパーを配置すると、必要に応じて内部を実装できます。例えば:

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 です。:)

于 2008-09-10T21:44:53.197 に答える
4

Python で再実装された whois クライアントは次のとおりです: http://code.activestate.com/recipes/577364-whois-client/

于 2011-03-31T00:37:11.253 に答える
1

gwhois がサーバー出力に対して何か特別なことを行っているかどうかはわかりません。ただし、ポートwhois(43)でwhoisサーバーに接続し、クエリを送信し、応答のすべてのデータを読み取って解析することはできます. 生活を少し楽にするために、単純なソケットの代わりに telnetlib.Telnet クラスを使用できます (whois プロトコルが telnet プロトコルよりもはるかに単純であっても)。

トリッキーな部分:

  • どのwhoisサーバーに質問しますか? RIPE、ARIN、APNIC、LACNIC、AFRINIC、JPNIC、VERIO など LACNIC は、ドメイン外の要求に対して有用なデータで応答する傾向があるため、有用なフォールバックになる可能性があります。
  • 各whoisサーバーの正確なオプションと引数は何ですか? ヘルプを提供するものもあれば、提供しないものもあります。通常、プレーンなドメイン名は特別なオプションなしで機能します。
于 2008-09-16T00:23:53.210 に答える
0

これを行う別の方法は、urllib2モジュールを使用して他のページのwhoisサービス(そのような多くのサイトが存在する)を解析することです。しかし、それはあなたが今していることよりもさらにハックのように思え、あなたが選んだwhoisサイトに依存することになります。これは悪いことです。

私はそれを言うのは嫌ですがwhois、あなたがあなたのプログラムに再実装したいのでなければ(それは車輪の再発明になるでしょう)、whoisOS上で実行して出力(つまりあなたが今していること)を解析することは正しい方法のようですやれ。

于 2008-09-08T18:53:37.990 に答える
0

別のWebページの解析はそれほど悪くはありませんが(HTMLがそれほど悪くないと仮定すると)、実際には私をそれらに結び付けます-彼らがダウンしている場合、私はダウンしています:)

実際、sourceforgeで古いプロジェクトrwhois.pyを見つけました。少し怖いのは、最後の更新が2003年からであるということです。しかし、今行っていることの再実装を開始するのに良い場所のように思えるかもしれません...まあ、とにかくこのプロジェクトへのリンクを投稿する義務があると感じました。さらなる参照のために。

于 2008-09-08T19:00:58.957 に答える
0

これは、私にとってすぐに使えるソリューションです。Python 3.1 用に書かれています (Py2.x にバックポートする場合は、バイトと Unicode テキストの区別に特に注意してください)。単一のアクセス ポイントはDRWHO.whois()、ドメイン名が渡されることを期待する method です。次に、構成されたプロバイダーを使用して名前を解決しようとしますDRWHO.whois_providers[ '*' ](より完全なソリューションでは、最上位ドメインに従ってプロバイダーを区別できます)。は、WHOIS サーバーから返された応答テキストを含むDRWHO.whois()単一のエントリを持つ辞書を返します。text繰り返しになりますが、より完全なソリューションでは、テキストを解析して解析し (標準形式がないため、プロバイダーごとに個別に実行する必要があります)、より構造化された形式を返します (たとえば、フラグを設定します)。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' ] )
于 2010-03-09T16:17:23.993 に答える
0
import socket
socket.gethostbyname_ex('url.com')

gaierror が返された場合は、DNS に登録されていないことがわかります。

于 2010-03-09T10:07:39.447 に答える