ドメインに対しての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サーバーに問い合わせを行い、ドメイン名の登録情報や更新日時、有効期限などを取得することができる。 日本のドメインは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の記事の中でもパーサーを修正してみたというのがあるので、まずはこっちを試してみようかなー。
参考文献
- PythonのWhoisライブラリの闇
- richardpenman/whois (GitHubリポジトリ)