如何高效查询50000个域名的可用性及价格?
高效批量查询域名可用性及价格方案
问题分析
你之前采用的WHOIS串行查询效率极低,核心原因有两点:
- WHOIS服务器普遍存在请求频率限制,单线程逐个请求极易触发限流,导致超时或失败;
- 50000条域名串行查询,即使单条请求仅耗时1秒,总耗时也超过13小时,完全不具备实用性。
names.com批量工具无法使用,可转向以下更可靠的方案。
可行解决方案
1. 优先使用注册商官方API
主流域名注册商(如GoDaddy、Namecheap等)均提供批量查询API,这类API不仅查询速度快,还能直接返回域名可用性及注册/续费价格,是最优选择。
以Python异步调用为例,使用aiohttp实现批量请求(需替换为目标注册商的API密钥及接口):
import aiohttp import asyncio async def batch_check_api(session, domain_batch): api_url = "https://api.target-registrar.com/v1/domain/check" payload = {"domains": domain_batch, "include_pricing": True} headers = {"Authorization": "Bearer YOUR_API_KEY"} async with session.post(api_url, json=payload) as resp: result = await resp.json() return [ { "domain": item["domain"], "available": item["available"], "price": item.get("registration_price") } for item in result["data"] ] async def run_batch_query(domain_list, batch_size=100): async with aiohttp.ClientSession() as session: tasks = [] # 按批次拆分域名列表,避免单次请求数据量过大 for i in range(0, len(domain_list), batch_size): batch = domain_list[i:i+batch_size] tasks.append(batch_check_api(session, batch)) # 并发执行所有批次请求 all_results = await asyncio.gather(*tasks) # 合并结果并过滤可注册域名 registrable_domains = [] for batch_result in all_results: registrable_domains.extend([d for d in batch_result if d["available"]]) return registrable_domains # 使用示例 your_domain_list = ["presumptuous.ly", "principaliti.es", ...] # 替换为你的50000条域名 available_with_price = asyncio.run(run_batch_query(your_domain_list))
注意:不同注册商的API参数、批量大小限制及返回格式存在差异,需参考对应官方文档调整;同时务必妥善保管API密钥。
2. 异步优化WHOIS查询(仅当无法使用API时)
若必须依赖WHOIS查询,可通过异步请求+并发控制提升效率,使用aiowhois库实现:
import asyncio from aiowhois import WHOISClient async def check_single_domain(domain): client = WHOISClient() try: whois_result = await client.query(domain) # 不同域名后缀的WHOIS返回格式存在差异,需根据实际情况调整判断逻辑 available = "status" not in whois_result or whois_result["status"] == "free" return {"domain": domain, "available": available} except Exception as e: print(f"查询{domain}出错: {str(e)}") return {"domain": domain, "available": False} async def batch_whois_query(domain_list, max_concurrent=20): # 用信号量控制并发数,避免触发WHOIS服务器限流 semaphore = asyncio.Semaphore(max_concurrent) async def bounded_check(domain): async with semaphore: return await check_single_domain(domain) tasks = [bounded_check(domain) for domain in domain_list] all_results = await asyncio.gather(*tasks) return [res for res in all_results if res["available"]] # 使用示例 your_domain_list = ["presumptuous.ly", "principaliti.es", ...] available_domains = asyncio.run(batch_whois_query(your_domain_list))
该方式比串行查询效率提升10-20倍,但仍不如注册商API,且部分WHOIS服务器可能拦截高频请求,需根据实际情况调整并发数。
3. DNS预筛选+API查价结合
先用高性能DNS工具(如massdns)快速排除已注册域名,再对剩余域名查询价格,大幅减少后续查询量:
- DNS预筛选:通过查询域名SOA记录判断是否已注册(无SOA记录通常表示域名未被注册)
- 命令示例:
massdns -r resolvers.txt -t SOA -l your_domain_list.txt -o S - 解析输出结果,筛选出无SOA记录的域名,形成待查价格的小列表
- 命令示例:
- API查价:将筛选后的域名列表通过注册商API查询具体价格
这种方式能快速排除90%以上的已注册域名,大幅降低后续查询的工作量。
内容的提问来源于stack exchange,提问作者gnarbarian
相关产品推荐
相关产品推荐

