需求场景
个站爱好者、终身做项目的人都喜欢"凑个好域名"。但好的短域名(3-4 字符)、有意义的英文单词域名,99% 都已经被注册。手动一个个去 whois 查太慢,而且容易暴露你的兴趣给域名抢注者。
解决方案:写个 Python 脚本批量扫域名注册状态,基于本地字典生成候选,过滤掉已注册的,留下可用的。

核心功能
这个工具能:
- 批量扫描:支持千万级域名候选,异步并发查询
- 多 TLD 支持:
.com/.net/.io/.dev/.app等几十种顶级域 - 字典生成:基于字符规则(3 位、4 位、品牌词、行业词)自动构建候选
- 结果存储:可用域名写到 CSV,后续手动确认
- 速度可控:可调并发度,避免被 whois 服务器封 IP
主源代码
import whois
import time
import string
import itertools
import asyncio
import aiohttp
from datetime import datetime
from tqdm import tqdm # 添加进度条支持
def generate_letter_domains(tld=".com"):
"""生成所有四位字母域名组合"""
letters = string.ascii_lowercase
return [''.join(combo) + tld for combo in itertools.product(letters, repeat=4)]
def generate_number_domains(tld=".com"):
"""生成所有四位数字域名组合"""
return [f"{num:04d}{tld}" for num in range(10000)]
async def check_domain_availability_async(domain, session):
"""异步检查域名是否可用"""
try:
async with session.get(f'http://whois.iana.org/whois?q={domain}', timeout=5) as response:
if response.status == 200:
text = await response.text()
return "No match" in text
return False
except:
return False
async def batch_check_domains(domains, batch_size=500):
"""批量异步检查域名"""
available_domains = []
async with aiohttp.ClientSession() as session:
with tqdm(total=len(domains), desc="查询进度") as pbar:
for i in range(0, len(domains), batch_size):
batch = domains[i:i + batch_size]
tasks = [check_domain_availability_async(domain, session) for domain in batch]
results = await asyncio.gather(*tasks)
for domain, is_available in zip(batch, results):
if is_available:
available_domains.append(domain)
print(f"域名 {domain} 未被注册!")
pbar.update(len(batch))
time.sleep(0.1) # 稍微降低请求频率,但不至于太慢
return available_domains
def main():
print("请选择要查询的域名类型:")
print("1. 四位纯字母域名")
print("2. 四位纯数字域名")
choice = input("请输入选项(1或2):")
tld = input("请输入顶级域名(直接回车默认为.com):") or ".com"
if not tld.startswith('.'):
tld = '.' + tld
max_domains = input("请输入要查询的域名数量(直接回车查询全部):")
# 根据选择生成域名列表
if choice == "1":
domains = generate_letter_domains(tld)
type_str = "字母"
elif choice == "2":
domains = generate_number_domains(tld)
type_str = "数字"
else:
print("无效的选项!")
return
# 限制查询数量
if max_domains.isdigit():
domains = domains[:int(max_domains)]
print(f"n将查询前 {max_domains} 个域名...")
output_file = f"available_{type_str}_domains_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
print(f"总共需要查询 {len(domains)} 个域名")
try:
# 使用异步方式查询域名
available_domains = asyncio.run(batch_check_domains(domains))
# 保存结果
with open(output_file, "w", encoding="utf-8") as f:
f.write(f"# 查询时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}n")
f.write(f"# 域名类型: 四位{type_str}n")
f.write(f"# 顶级域名: {tld}n")
f.write("# 可注册的域名列表:nn")
for domain in available_domains:
f.write(f"{domain}n")
print(f"n查询完成!")
print(f"共发现 {len(available_domains)} 个可注册域名")
print(f"结果已保存到: {output_file}")
except KeyboardInterrupt:
print("nn用户中断查询!")
print(f"已查询 {len(domains)} 个域名")
print(f"已找到 {len(available_domains)} 个可注册域名")
print(f"结果已保存到: {output_file}")
except Exception as e:
print(f"n发生错误: {str(e)}")
print(f"已查询的结果已保存到: {output_file}")
if __name__ == "__main__":
main()
原理
判断域名是否注册的几种方式:
方式 1:WHOIS 查询(最准)
每个顶级域(TLD)有自己的 WHOIS 服务器:
.com / .net→whois.verisign-grs.com.io→whois.nic.io.dev→whois.nic.google.cn→whois.cnnic.cn
给 WHOIS 服务器发查询包,根据响应里有没有"NOT FOUND" 之类的关键字判断。准确但慢,且 WHOIS 服务器普遍有限速。
方式 2:DNS 查询(快但不全)
已注册域名通常有 DNS 记录:
import dns.resolver
try:
dns.resolver.resolve("example.com", "NS")
print("已注册")
except dns.resolver.NXDOMAIN:
print("未注册")
except dns.resolver.NoAnswer:
print("已注册但无 NS")
速度很快,但有些已注册域名没设 DNS,会误判为未注册。适合"粗筛"。
方式 3:RDAP(WHOIS 的下一代)
RDAP 是基于 HTTP+JSON 的协议,响应结构化好处理:
import requests
r = requests.get("https://rdap.org/domain/example.com")
if r.status_code == 404:
print("未注册")
elif r.status_code == 200:
print("已注册")
方式 4:商业 API
付费但稳定:
- WhoisXMLAPI
- RDAP.org(免费 + 付费混合)
- 各域名注册商 API(GoDaddy / NameCheap / 阿里万网)
实用技巧
1. 先用 DNS 粗筛,再用 WHOIS 精筛
async def is_available(domain):
# 先 DNS 快查
if not has_dns(domain):
# DNS 没有,WHOIS 再确认
return await whois_check(domain)
return False # 有 DNS = 已注册
这样 90% 的"明显已注册"域名直接被 DNS 过滤掉,WHOIS 只查剩下 10%,速度快 10 倍。
2. 并发度控制
import asyncio
semaphore = asyncio.Semaphore(20) # 同时最多 20 个查询
async def check(domain):
async with semaphore:
return await is_available(domain)
太高的并发会被 WHOIS 服务器封 IP,20-50 是安全区间。
3. 用代理池
批量扫好几万个域名时,WHOIS 服务器会按 IP 限速。配代理池轮换 IP:
import random
proxies_pool = [
{"http": "http://proxy1:8080", "https": "http://proxy1:8080"},
{"http": "http://proxy2:8080", "https": "http://proxy2:8080"},
]
proxy = random.choice(proxies_pool)
r = requests.get(url, proxies=proxy)
候选域名生成策略
有几个角度生成候选:
1. 字符全排列:
import itertools
# 所有 3 位字母组合(26^3 = 17576 个)
for combo in itertools.product('abcdefghijklmnopqrstuvwxyz', repeat=3):
domain = ''.join(combo) + '.com'
yield domain
# 所有 4 位数字 + 字母组合(便宜短域名)
chars = '0123456789abcdefghijklmnopqrstuvwxyz'
for combo in itertools.product(chars, repeat=4):
yield ''.join(combo) + '.com'
2. 字典词组合:
# 名词 + 动词组合,做 startup 名字
nouns = ['tech', 'sky', 'cloud', 'data', 'flow']
verbs = ['go', 'sync', 'flow', 'lab', 'works']
for n in nouns:
for v in verbs:
yield f"{n}{v}.com"
yield f"{n}-{v}.com"
3. 用 ChatGPT / Claude 生成:
import openai
response = openai.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": "请生成 100 个适合做 AI 工具网站的英文域名候选,每行一个,只要 .com 部分前的名字"
}]
)
candidates = response.choices[0].message.content.strip().split('n')
AI 生成的会更有"意义",纯算法生成的偏机械。
注意事项
1. 别批量提交注册。即使你查到 1000 个可用的,不要一次性都注册 —— 没用,养着也是养着,而且容易触发抢注者的策略反作弊。
2. 注意域名注册商的"溢价 / Premium"机制。有些可注册的域名标价 $300+ / 年(算法判定的"好域名"),你查到能注册≠ 实际能便宜注册。
3. 注意法律风险:
- 抢注他人商标域名 → 仲裁能被夺回
- 大量域名抢注 / 转售 → 部分注册商封号
这个脚本主要给"自己用、自己挑名字"的人,不是给抢注党。
一句话总结
用 Python + 异步 + DNS 粗筛 + WHOIS 精筛,几小时能扫完几万个候选域名。比起一个个手动查,效率提高 1000 倍,且能批量发现一些"机器看着不像但人看着挺好"的可用短域名。
—— 别看了 · 2026
学习一下