TSUBOCK★LABO-ツボックラボ-

とあるセキュリティエンジニアの技術メモブログ

MENU

Python-Whoisを使用してWhois情報を収集する

ドメインに対してのWhois情報を収集したいとき、もちろんLinuxのWhoisコマンドやWhoisを提供しているWebサービスを利用して収集する方法があるが、大量のURLリストに対してのWhois情報の収集を全て手で行うにはなかなか大変なので、Pythonを使って処理を自動化させてみた。

PythonでWhoisを実施する方法はいくつかあり、PythonでLinuxのWhoisコマンドを実行し結果をパースして情報を収集する方法やPythonの外部ライブラリを使用する方法などがある。他にもPythonのWhoisライブラリがあるみたいだけど、今回はPythonの外部ライブラリである「Python-Whois」を使う方法で情報収集を試みてみた。

参考:PythonのWhoisライブラリの闇

Python-Whois

Python-WhoisはPython用のWhoisクライアントライブラリ。PythonプログラムからWhoisサーバーに問い合わせを行い、ドメイン名の登録情報や更新日時、有効期限などを取得することができる。 日本のドメインはJPRS Whoisのほうに問合せに行くらしくレスポンスされるフォーマットが違うようでした。Parserモジュールを改修すればいけそうなようですが、とりあえずこのまま使用してみることに。

インストール

pipパッケージで管理されているのでpipインストールでインストールが可能です。

$ pip install python-whois

執筆時現在(2022/12/16)ではバージョンはv.0.8.0のようです。

$ pip list | grep whois
python-whois              0.8.0

使い方

サンプルとしてPython-Whoisを使ってwhois情報を取得してみたいと思います。

from whois import whois

# 確認したいドメインを引数にWhoisクライアントを呼び出す
res = whois('example.com')

# レジストラ情報をを表示
print(res.registrar)

結果は下記の通り。

{
  "domain_name": "EXAMPLE.COM",
  "registrar": "RESERVED-Internet Assigned Numbers Authority",
  "whois_server": "whois.iana.org",
  "referral_url": null,
  "updated_date": "2022-08-14 07:01:31",
  "creation_date": "1995-08-14 04:00:00",
  "expiration_date": "2023-08-13 04:00:00",
  "name_servers": [
    "A.IANA-SERVERS.NET",
    "B.IANA-SERVERS.NET"
  ],
  "status": [
    "clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited",
    "clientTransferProhibited https://icann.org/epp#clientTransferProhibited",
    "clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited"
  ],
  "emails": null,
  "dnssec": "signedDelegation",
  "name": null,
  "org": null,
  "address": null,
  "city": null,
  "state": null,
  "registrant_postal_code": null,
  "country": null
}

以下の用にキーを指定すると必要な項目も抜き出せます。

print(res.domain_name)
print(res.registrar)

出力結果

EXAMPLE.COM
RESERVED-Internet Assigned Numbers Authority

また先述の通りJPドメインのレスポンスはフォーマットが異なっていてParse処理が上手くいっていないようなので下記の通りJPドメインを指定すると

from whois import whois

res = whois('google.co.jp')

print(res)

下記の通り、期待していた値が返ってこない可能性があります。

出力結果

{
  "domain_name": null,
  "registrant_org": "Google Japan G.K.",
  "creation_date": null,
  "expiration_date": null,
  "name_servers": null,
  "updated_date": null,
  "status": null
}

収集できる値

whois実行で取得したオブジェクトは.keysを指定することでdictのkeyを確認することができます。

print(res.keys())

出力結果

dict_keys(['domain_name', 'registrar', 'whois_server', 'referral_url', 'updated_date', 'creation_date', 'expiration_date', 'name_servers', 'status', 'emails', 'dnssec', 'name', 'org', 'address', 'city', 'state', 'registrant_postal_code', 'country'])

勿論JPドメインで取得できる項目は少ないので

print(res.keys())

で得られる要素は以下の通り。

出力結果

dict_keys(['domain_name', 'registrant_org', 'creation_date', 'expiration_date', 'name_servers', 'updated_date', 'status'])

ちょっとJPドメインの情報ちゃんと取得したいし、Parser気になるからgitのコードを修正してみたいなぁとも思ったり。参照先のQiitaの記事の中でもパーサーを修正してみたというのがあるので、まずはこっちを試してみようかなー。

参考文献