Python批量扫未注册域名源码

需求场景

个站爱好者、终身做项目的人都喜欢"凑个好域名"。但好的短域名(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 / .netwhois.verisign-grs.com
  • .iowhois.nic.io
  • .devwhois.nic.google
  • .cnwhois.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 倍,且能批量发现一些"机器看着不像但人看着挺好"的可用短域名。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理 邮箱1846861578@qq.com。

1 条回复

A文章作者M管理员
上传评论图片
  1. yyc
    yyc初中lv2
    学习一下