ipwhois返回结果字段速查:一文读懂RDAP与Legacy Whois的完整数据结构
【免费下载链接】ipwhoisRetrieve and parse whois data for IPv4 and IPv6 addresses项目地址: https://gitcode.com/gh_mirrors/ip/ipwhois
ipwhois 是一款专注于IPv4 与 IPv6 whois 数据查询与解析的 Python 库,它会把各注册局(RIR)返回的原始报文,统一解析成结构清晰的标准字典。拿到一个results字典却不知如何下手?本文提供一份ipwhois 返回结果字段速查表,帮你一文读懂 RDAP 与 Legacy Whois 两种查询方式下的完整数据结构。📋
两种查询方法:RDAP 与 Legacy Whois 怎么选?
ipwhois 通过 ipwhois/ipwhois.py 中的IPWhois类提供两种主要查询方法:
| 方法 | 说明 | 返回格式 |
|---|---|---|
lookup_rdap() | ✅ 官方推荐的 RDAP(基于 HTTP 的 whois 协议)查询 | 结构化字典,含网络、组织、联系人实体 |
lookup_whois() | 传统 whois 协议查询(lookup()自 v0.12.0 起已废弃) | 网络列表 + 可选 referral 转介信息 |
RDAP 的优势在于数据结构更好:可以解析出用户、组织、分组的联系人信息,并提供更详细的网络数据。Legacy Whois 则在 RDAP 不可用时作为兜底方案。
公共顶层字段:ASN 系列速查表
两种查询方式的返回字典都包含同一组asn字段*,由 ipwhois/asn.py 中的IPASN模块生成(通过 DNS、whois、HTTP 三种方式依次尝试):
| 字段 | 类型 | 含义 |
|---|---|---|
query | str | 你查询的 IP 地址 |
asn | str | 自治系统编号(Autonomous System Number) |
asn_cidr | str | 分配给该 ASN 的路由网段 |
asn_country_code | str | ASN 分配国家码(ISO 3166-1 格式) |
asn_date | str | ASN 分配日期(ISO 8601 格式) |
asn_registry | str | 分配该 ASN 的注册局(arin / ripe / apnic / lacnic / afrinic) |
asn_description | str | ASN 描述,如"GOOGLE, US" |
💡注意:
asn_country_code来自 Cymru 数据,反映的是 ASN 的注册地,不等于 IP 实际地理位置,请勿当作 GeoIP 使用。
RDAP 返回字段完整拆解
RDAP 结果字典(lookup_rdap()输出)的顶层结构如下:
| 字段 | 类型 | 含义 |
|---|---|---|
query/asn* | str | 同上节公共字段 |
network | dict | 该 IP 所属的注册网络(可能是父或子网络),见下表 |
entities | list | 网络引用的对象(组织/联系人)名称列表 |
objects | dict | 各实体对象的详细信息,键为实体名 |
nir | dict | 日韩国家注册局补充信息(见下文) |
raw | dict | 原始 RDAP JSON(需设置inc_raw=True) |
🌐 network 网络字典
| 字段 | 类型 | 含义 |
|---|---|---|
cidr | str | IP 所属的路由网段,如74.125.0.0/16 |
country | str | 注册国家码(ISO 3166-1) |
start_address/end_address | str | 网段的起止 IP 地址 |
events | list | 事件列表(注册、最后变更等),每项含action、timestamp、actor |
handle/parent_handle | str | 该注册对象的唯一标识 / 父网络标识 |
ip_version | str | 协议版本(v4或v6) |
name | str | 网络注册名称,如GOOGLE |
notices/remarks | list | 通知与备注列表,每项含title、description、links |
links | list | 注册局提供的 HTTP/HTTPS 链接 |
status | list | 注册对象状态,如["active"] |
type | str | RIR 分类,如DIRECT ALLOCATION |
🏢 objects 实体字典(含联系人)
objects中每个键(如GOGL、ABUSE5250-ARIN)对应一个实体对象:
| 字段 | 类型 | 含义 |
|---|---|---|
handle | str | 实体唯一标识 |
roles | list | 角色,如registrant(注册人)、abuse(滥用投诉)、technical/administrative |
contact | dict | 联系人信息,见下表 |
entities | list | 该实体引用的下级实体名称 |
events/notices/remarks/links/status | list | 含义同 network 字典 |
其中contact 联系人字典是 RDAP 的精华所在,由 ipwhois/rdap.py 中的 vCard 解析器生成:
| 字段 | 类型 | 含义 |
|---|---|---|
name | str | 联系人名称,如Google LLC |
kind | str | 类型:individual(个人)/group(分组)/org(组织) |
address | list | 邮政地址列表(type + value) |
email | list | 邮箱列表,如network-abuse@google.com |
phone | list | 电话列表,type 可为work、voice、fax等 |
title/role | str | 职位 / 角色 |
🔍
depth参数控制实体解析深度:depth=0只查网络层引用的实体;每加深一层,都会向注册局发起更多查询,耗时也随之增加。批量查询时建议配合调低rate_limit_timeout、调小retry_count来规避注册局限速。
Legacy Whois 返回字段完整拆解
lookup_whois()的结果字典(解析逻辑见 ipwhois/whois.py)与 RDAP 的差异主要在网络信息部分:
| 顶层字段 | 类型 | 含义 |
|---|---|---|
query/asn* | str | 公共字段(同上) |
nets | list | 网络字典列表(一个 IP 可能有多个父/子网络) |
referral | dict | 转介 whois 信息(需get_referral=True) |
raw/raw_referral | str | 原始 whois 文本(需inc_raw=True) |
nir | dict | 日韩注册局补充信息(同 RDAP) |
nets 网络字典的字段比 RDAP 更"扁平化":
| 字段 | 类型 | 含义 |
|---|---|---|
cidr/range | str | 路由网段 / IP 区间,如74.125.0.0 - 74.125.255.255 |
name/handle | str | 网络名称 / 唯一标识 |
description | str | 网络描述,如Google Inc. |
country/state/city | str | 国家码 / 州省 / 城市 |
address/postal_code | str | 邮寄地址 / 邮编 |
emails | list | 邮箱地址列表 |
created/updated | str | 注册日期 / 更新日期(ISO 8601) |
💡 两个实用细节:当 whois 报文列出多个同名连续字段(如多个Description:)时,解析器会用\n拼接其值;一个网络含多个 CIDR 时会用", "分隔。
NIR 字段:日本与韩国的"加餐"数据 🇯🇵🇰🇷
对于 JPNIC(日本)和 KRNIC(韩国)管理的 IP,区域注册局会屏蔽部分详细信息。ipwhois 内置 NIR 支持(ipwhois/nir.py),默认开启(inc_nir=True),结果挂在顶层nir键下:
nir.nets:网络列表,字段与 Legacy Whois 的 nets 类似,额外提供nameservers(域名服务器列表)nir.nets[].contacts:含admin/tech两个联系人,各有name、organization、email、phone、fax、title等字段nir.raw:原始 NIR whois 文本(需inc_raw=True)
例如查询大阪大学的 IP 时,nets只能看到 JPNIC 的笼统信息,而nir里能拿到具体的行政/技术联系人。
上手示例:3 行代码看懂字段
from ipwhois import IPWhois from pprint import pprint obj = IPWhois('74.125.225.229') pprint(obj.lookup_rdap(depth=1)) # 推荐:RDAP 完整结构 pprint(obj.lookup_whois()) # 备选:Legacy Whois 结构完整示例输出可参考测试数据文件 ipwhois/tests/rdap.json 和 ipwhois/tests/whois.json,它们分别记录了同一 IP 的 RDAP 与 Whois 原始响应。
相关文档与源码文件一览
| 资源 | 路径 |
|---|---|
主入口(IPWhois类) | ipwhois/ipwhois.py |
| RDAP 解析实现 | ipwhois/rdap.py |
| Legacy Whois 解析实现 | ipwhois/whois.py |
| ASN 查询实现 | ipwhois/asn.py |
| NIR 国家注册局解析 | ipwhois/nir.py |
| RDAP 字段官方文档 | RDAP.rst |
| Legacy Whois 字段官方文档 | WHOIS.rst |
| NIR 字段官方文档 | NIR.rst |
| ASN 查询文档 | ASN.rst |
| CLI 命令行工具(可读化输出字段) | ipwhois/scripts/ipwhois_cli.py |
常见疑问速答 🧭
Q1:为什么某些字段是None?注册局未提供该数据(如 RDAP 中很多country为空),不代表查询失败。
Q2:raw字段什么时候有值?默认不返回,需要显式传入inc_raw=True。RDAP 返回的是 JSON 字典,Legacy Whois 返回的是原始文本。
Q3:查询慢/被限速怎么办?批量查询时把rate_limit_timeout调小,或设置bootstrap=True走 ARIN 引导解析(代价是不返回 asn* 字段);也可以试试实验性批量接口(见 EXPERIMENTAL.rst)。
Q4:如何把字段名翻译成可读文案?使用 ipwhois/hr.py 中的人读字段映射,或直接用附带颜色输出的 CLI 工具查看结果。
掌握本文的字段速查表后,你就能快速定位 RDAP 与 Legacy Whois 返回字典中的任何一个字段,把 whois 数据真正用起来!🚀
【免费下载链接】ipwhoisRetrieve and parse whois data for IPv4 and IPv6 addresses项目地址: https://gitcode.com/gh_mirrors/ip/ipwhois
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考