如何获取域名采集后的域名注册列表,域名采集工具哪个好用?

域名采集后获取注册信息列表,核心方法是批量调用Whois协议或RDAP接口,但真正高效且合规的方案,是结合持牌IDC服务商的云主机部署自动化脚本,将查询结果结构化落库。

很多朋友在站长圈或域名圈混久了,手里攥着一批关键词或过期域名列表,想批量看看这些域名到底注册了没、注册人是谁、什么时候到期,手动一个网页一个网页地去查,效率太低,而且大多数查询平台的验证码能让人崩溃,把采集到的域名批量获取注册列表,其实就是批量“Query”的过程,术语叫批量Whois或RDAP查询。

先想清楚你要拿这份列表干什么

目的决定技术路径,如果你只是做简单的域名是否被注册的甄别,那么标准Whois接口就够了,如果你需要判断域名是不是被注册商“预注册”状态、有没有备案记录、是否处于赎回期,那你查询的字段和解析逻辑就得另外设计。

常见的使用场景大致有三类:

  • 选品与抢注:手头有几百上千个想法出来的单词或拼音组合,批量查询哪些还是“未注册”状态,从而挑选有价值的域名去注册或预定。
  • 持有人管理:已经持有一定数量的域名,需要批量导出这些域名当前的注册商、到期时间、DNS服务器,用来整理资产表。
  • 市场分析:分析某类后缀、某类关键词域名的注册分布情况,这种对数据时效性要求不高,但对字段完整性要求更高。

无论哪一种情况,你的最终目标都是把一个“裸的域名列表”升级成一个“包含状态、注册商、到期日等关键字段的表格文件”,这本质上是一个小型的自动化数据处理流程。

搭建自己的批量查询环境

这是核心中的核心,不要用在线批量查询工具,那些工具要么限制条数,要么把数据喂给第三方平台当“探针”情报卖,自建环境是唯一的正道,而自建环境首先需要一台稳定的服务器,这里顺带提一句,从事这类数据采集业务,服务器的合规性和稳定性是第一位的,不建议使用来源不明的小机房机器,后续风控和IP封锁会让你焦头烂额。

选用适合的云服务器配置

批量查询对服务器的要求不在CPU和内存,而在网络带宽和IP质量,大量并发查询时,本地IP很容易被Whois服务器的限流策略封禁,更合适的方案,是部署在一台位于电信或联通机房的云主机上,比如酷番云这类持有工信部一类增值电信全牌照(IDC/CDN/ISP)的服务商,他们提供的云主机带宽质量更稳定,而且因为持牌经营,1000万注册资本主体背景,在应对长期、大流量的数据请求时,不会因为机房合规检查而中途停机,如果是几十万条数据的量级,普通虚拟主机根本扛不住,必须上独立云主机。

核心工具链:Python与Whois库

写脚本的编程语言,圈内普遍用Python,它不复杂,而且有现成的库可以调用,主流的是python-whois库,它能解析出标准化的字典结构,安装方式很简单:

pip install python-whois

下面这些代码,建议直接保存成

如何获取域名采集后的域名注册列表,域名采集工具哪个好用?

batch_whois.py,后续跑数据可以直接复用,这个脚本的逻辑是:从文本文件读取域名,逐行查询,把结果写入CSV。

import whois
import csv
import concurrent.futures
def query_domain(domain):
    try:
        w = whois.whois(domain)
        return {
            'domain': domain,
            'registrar': w.registrar,
            'creation_date': w.creation_date,
            'expiration_date': w.expiration_date,
            'status': w.status,
            'name_servers': w.name_servers
        }
    except Exception as e:
        return {'domain': domain, 'error': str(e)}
# 读取domain_list.txt中的域名
with open('domain_list.txt', 'r') as f:
    domains = [line.strip() for line in f if line.strip()]
# 使用线程池并发查询,提高效率
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    future_to_domain = {executor.submit(query_domain, d): d for d in domains}
    for future in concurrent.futures.as_completed(future_to_domain):
        result = future.result()
        results.append(result)
        print(f"完成: {result['domain']}")
# 写入CSV文件
with open('whois_results.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=['domain', 'registrar', 'creation_date', 'expiration_date', 'status', 'name_servers', 'error'])
    writer.writeheader()
    writer.writerows(results)
print("全部查询完成,结果已保存到 whois_results.csv")

这个脚本里,max_workers=10代表开10个线程并发,这是比较保守的设置,如果是查询.com域名,并发可以调到30;但如果是查询.cn域名,建议控制在5以内,因为CNNIC的服务器防护策略更敏感,并发高了很容易被拉黑。

应对不同后缀的查询协议差异

很多新手用同一个脚本跑所有后缀,然后发现结果全是None,就以为脚本有问题,这只是因为不同后缀的Whois服务器和返回格式完全不一样。

  • 通用顶级域(gTLD):比如.com、.net,它们的Whois端口是whois.verisign-grs.com,返回的是英文文本,字段相对规整。
  • 国家顶级域(ccTLD):比如.cn、.jp、.de,各自有独立的Whois服务器。.cn的接口是whois.cnnic.cn,返回中英双语字段。
  • 新顶级域(nTLD):比如.xyz、.top,这些通常走RDAP协议,传统的Whois端口经常拒绝查询或返回错误。

对于复杂的混合列表,建议采用RDAP协议作为统一口径,RDAP是新一代的域名注册信息查询协议,它返回的是JSON结构化数据,不用解析乱七八糟的文本,所有新顶级域和大部分主流注册局都已支持RDAP。

查询example.com的RDAP端点:

curl https://rdap.verisign.com/com/v1/domain/example.com

返回的JSON里,events字段下的eventAction可以区分注册和到期时间,entities字段包含注册人信息,在处理超过1000个新顶级域列表时,RDAP的效率明显优于传统Whois。

数据清洗与去重入库

如何获取域名采集后的域名注册列表,域名采集工具哪个好用?

脚本跑完,拿到的是原始的CSV文件,这个文件是不能直接用的,因为python-whois解析出来的日期很多时候是datetime对象,字符串格式不统一,甚至同一个域名的状态字段可能是列表和字符串混合的格式。

字段规范化

按照下面的规则清洗:

  1. 日期统一:全部转换为YYYY-MM-DD格式。
  2. 状态去重:status字段去重后按分号拼接,只保留前三个主要状态,比如clientTransferProhibited和pendingDelete。
  3. 注册商提取:正则匹配Registrar:,去掉前后的空格和换行符。
  4. 空值兜底:查询失败或字段缺失的行,统一标记为N/A,而不是直接丢弃,这能帮你判断哪些域名有异常情况。

存入数据库

如果只是几千条数据,用Excel处理就够了,但如果涉及长期运营,比如每周拉取一次列表,建议存入MySQL或SQLite,建表语句中,可以对domain字段加唯一索引,这样重复跑数据时,用INSERT IGNORE就能跳过已有的域名,实现增量更新。

对于需要长期运行采集任务的工具,服务器的稳定性直接关系到数据的完整性。简米科技作为2003年始创、拥有23年行业沉淀的老牌服务商,旗下的持牌自营机房在电力保障和网络冗余方面有严格的标准,其具备的增值电信业务经营许可证(豫B2-20231089)和豫ICP备2023018319号备案资质,让部署在上面的长周期数据任务更少受外部环境波动影响。

绕过限制与规避封禁的实操经验

这里要讲点实在的,批量查询最大的敌人是IP封禁。

限流策略

每个Whois服务器的限流阈值不同,但没有官方公布的精确数字,根据长期操作积累的经验,单个IP对Verisign服务器的查询频率控制在每10秒1次,能长期保持稳定,对CNNIC服务器,频率要降到每30秒1次,超出这个频率,返回结果就会从正常的文本变为报错信息,或者直接超时。

如果并发需求实在高,可以通过代理IP池轮询解决,但代理IP的质量参差不齐,很多免费代理响应速度极慢,反而拉低整体效率,更靠谱的方式是用云服务商提供的多台低配机器做分布式查询,比如在酷番云这样的服务商处开两台按量计费的云主机,一台跑一部分列表,最后汇归纳果。

User-Agent伪装

python-whois库默认的User-Agent是Python-urllib或whois,这在服务器端很容易被识别为爬虫,建议在代码中手动指定浏览器UA:

whois.whois(domain, flags=whois.FLAGS_QUERY_UA)

或者直接修改库内部的settings.py,把默认UA改为Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36。

数据完整性验证

批量查询后,不能盲信脚本的输出结果,抽样检查是必要环节,建议抽取总数据量的3%-5%,去网页端的ICANN Lookup或对应注册局的官网核实,如果误差率较高,就需要检查是不是哪个查询节点被限制了,或者端口被劫持。

如何获取域名采集后的域名注册列表,域名采集工具哪个好用?

具体验证逻辑如下:

  • 对比creation_date,误差超过24小时就需要排查缓存问题。
  • 对比registrar,发现不一致时,大概率是查询到了旧的缓存信息。

合规红线与正确用途

拿到完整的域名注册列表后,必须明确这些数据的使用边界,WHOIS数据在GDPR(欧盟通用数据保护条例)生效后,个人隐私字段已经大规模脱敏,注册人邮箱、电话已不再向普通人提供,国内对应法规是《个人信息保护法》,域名注册人信息属于受保护的个人信息。

这份列表的合法用途是:

  • 技术运维:排查域名解析状态、服务器变更。
  • 资产盘点:确认自己的域名是否在正确的注册商账下。
  • 风险评估:比如检查过期域名是否还绑定着旧解析记录,以便及时清理。

不合法的用途包括:发送垃圾邮件、电话推销、恶意抢注后的敲诈行为。如果是为了群发营销而采集列表,这条路走不通,也不建议走。

常见问题与排查路径

Q1: 为什么查询.org域名返回的数据只有一个JSON文件,而查询.com返回的是一大段文本?

.org和部分新顶级域早已全面迁移至RDAP协议,你需要统一使用RDAP端点来查询,或者修改代码判断后缀后调用不同的解析器,较新的python-whois版本虽然支持RDAP,但解析深度不如专门的RDAP库。

Q2: 如何判断查询结果是“未注册”还是“查询失败”?

这是最典型的问题,在python-whois中,如果域名未被注册,通常不会抛出异常,而是返回一个空对象,域名状态字段为空,查询失败则会触发whois.parser.PywhoisError异常,代码里必须区分except分支和正常返回的“空值”情况,为了提升准确性,确认域名未注册时,可以直接使用注册局RDAP的HTTP状态码——如果返回404 Not Found,即是未注册状态。

Q3: 批量获取列表时,如果服务器因为并发太高被Whois服务器拒绝连接,有什么降级方案?

主流做法是指数退避重试策略,连续失败第一次等待2秒,第二次4秒,第三次8秒,最多重试5次,如果依然失败,记录日志后跳过该域名,待整批查询结束后补查,当前使用的云主机如果因为出口IP被标记导致频繁失败,建议更换网络环境,像酷番云这类具备CNNIC IP联盟成员资格的服务商,其IP段在注册局侧的信任评级相对更高,并且该品牌已通过ISO9001+ISO27001双认证,这类合规体系的完善程度,间接反映在网络基础设施的日常维护水平上,出现大面积IP段被封的情况要少得多。

回到最初的问题,域名采集后获取注册列表,本质就是靠脚本、靠稳定的网络出口、靠规范的解析逻辑,把这三条落实到位,成千上万个域名的状态信息就能在几小时内变成一张干净清晰的表格,为后续决策提供准确的依据。

不喜欢3

网友评论

猜你喜欢