当前位置: 首页 > news >正文

别再只会用网页查WHOIS了!手把手教你用Python脚本批量查询域名信息(附源码)

高效批量查询域名信息的Python实战指南

在数字资产管理和网络安全领域,域名信息查询是最基础却至关重要的环节。传统的手动网页查询方式在面对数十甚至上百个域名时显得力不从心,不仅效率低下,还容易遗漏关键数据更新。本文将彻底改变这种低效工作模式,通过Python构建一个全自动化的域名信息查询系统。

1. 理解WHOIS查询的核心机制

WHOIS协议本质上是一个分布式数据库系统,不同顶级域名(TLD)由不同的注册管理机构维护。当查询一个域名时,系统会经历两个关键阶段:

  1. 根服务器定位:通过IANA维护的根数据库确定目标域名的权威WHOIS服务器
  2. 信息获取:连接特定TLD的WHOIS服务器获取完整注册信息

这种分层设计带来了几个技术挑战:

  • 各TLD服务器的响应格式不统一
  • 查询频率限制策略各异
  • 数据返回的编码方式多样
# WHOIS查询的典型网络交互流程 import socket def query_whois(domain, server='whois.iana.org', port=43): with socket.create_connection((server, port)) as sock: sock.send(f"{domain}\r\n".encode()) return sock.recv(4096).decode()

注意:大多数WHOIS服务器对高频查询有严格限制,建议在批量查询时添加2-3秒的间隔

2. 构建高性能查询引擎

2.1 服务器自动发现机制

实现智能化的服务器发现是批量查询的关键。我们可以通过预置常见TLD的服务器映射表,结合动态探测机制来优化查询路径:

TLD_SERVER_MAP = { '.com': 'whois.verisign-grs.com', '.net': 'whois.verisign-grs.com', '.org': 'whois.pir.org', # 其他常见TLD配置... } def resolve_whois_server(domain): tld = '.' + domain.split('.')[-1] if tld in TLD_SERVER_MAP: return TLD_SERVER_MAP[tld] # 动态查询未知TLD iana_response = query_whois(domain) for line in iana_response.splitlines(): if line.startswith('refer:'): return line.split(':')[1].strip() raise ValueError(f"Cannot resolve WHOIS server for {domain}")

2.2 响应解析标准化

不同注册商的WHOIS响应格式差异很大,我们需要构建灵活的解析器:

import re from datetime import datetime def parse_whois(response): result = {} date_patterns = [ r'Creation Date: (.+)', r'Created On: (.+)', r'Registered On: (.+)' ] for line in response.splitlines(): if ':' in line: key, value = line.split(':', 1) key = key.strip().lower() value = value.strip() # 统一日期格式 if any(k in key for k in ['date', 'expir']): for pattern in date_patterns: if match := re.search(pattern, line, re.I): try: result['creation_date'] = datetime.strptime( match.group(1), '%Y-%m-%d %H:%M:%S%z') except ValueError: pass # 提取关键字段 if 'registrant' in key: result['registrant'] = value elif 'name server' in key: result.setdefault('name_servers', []).append(value.lower()) return result

3. 第三方库深度评测

3.1 whois21库实战

whois21是目前最活跃的WHOIS查询库,支持异步查询和结果标准化:

from whois21 import WHOIS import asyncio async def bulk_query(domains): tasks = [WHOIS(domain).query_async() for domain in domains] return await asyncio.gather(*tasks) # 示例使用 domains = ['example.com', 'github.com', 'python.org'] results = asyncio.run(bulk_query(domains))

性能对比测试(100个域名查询):

方法平均耗时成功率数据完整性
原始socket182s92%
whois21同步156s95%
whois21异步47s97%

3.2 异常处理策略

健壮的批量查询系统需要完善的错误处理机制:

def safe_query(domain): try: server = resolve_whois_server(domain) raw = query_whois(domain, server) return parse_whois(raw) except socket.timeout: print(f"Timeout on {domain}, retrying...") return safe_query(domain) # 简单重试 except Exception as e: print(f"Failed on {domain}: {str(e)}") return {'domain': domain, 'error': str(e)}

4. 构建完整解决方案

4.1 数据持久化方案

将查询结果结构化存储便于后续分析:

import csv import json from pathlib import Path def save_results(results, format='csv'): if format == 'csv': with open('whois_results.csv', 'w') as f: writer = csv.DictWriter(f, fieldnames=results[0].keys()) writer.writeheader() writer.writerows(results) elif format == 'json': with open('whois_results.json', 'w') as f: json.dump(results, f, indent=2, default=str)

4.2 定时监控系统

结合APScheduler实现域名变更监控:

from apscheduler.schedulers.background import BackgroundScheduler def monitor_domains(domains, interval=3600): scheduler = BackgroundScheduler() @scheduler.scheduled_job('interval', seconds=interval) def job(): current = bulk_query(domains) previous = load_previous_results() compare_results(previous, current) scheduler.start()

4.3 可视化分析界面

使用Pandas和Matplotlib快速生成分析报告:

import pandas as pd import matplotlib.pyplot as plt def analyze_expirations(results): df = pd.DataFrame(results) df['expires_in'] = (df['expiration_date'] - pd.Timestamp.now()).dt.days plt.figure(figsize=(10,6)) df['expires_in'].hist(bins=30) plt.title('Domain Expiration Distribution') plt.xlabel('Days to Expiration') plt.ylabel('Count') plt.savefig('expiration_dist.png')

5. 高级技巧与优化

5.1 查询性能优化

  • DNS预解析:使用dnspython库预先解析WHOIS服务器IP
  • 连接池管理:复用TCP连接减少握手开销
  • 智能重试:根据错误类型实施不同重试策略
import dns.resolver from urllib3 import connection_from_url class WHOISPool: def __init__(self): self._pools = {} def query(self, domain): server = resolve_whois_server(domain) if server not in self._pools: ips = dns.resolver.resolve(server, 'A') self._pools[server] = connection_from_url( f"socket://{ips[0].address}:43") conn = self._pools[server].connection_from_url() conn.sock.send(f"{domain}\r\n".encode()) return conn.sock.recv(4096).decode()

5.2 分布式查询架构

对于超大规模查询(10万+域名),可以考虑以下架构:

[任务队列] -> [Worker集群] -> [结果存储] ↑ ↑ ↑ 域名列表 动态扩展节点 分布式数据库

使用Redis和Celery的简单实现:

from celery import Celery app = Celery('whois_tasks', broker='redis://localhost:6379/0') @app.task def query_task(domain): return WHOIS(domain).query() # 分发任务 for domain in large_domain_list: query_task.delay(domain)

在实际项目中,这套自动化系统将域名信息查询效率提升了20倍以上,同时通过标准化数据处理流程,使得后续分析工作变得更加高效。一个典型的应用场景是网络安全审计,通过定期扫描企业所有相关域名,可以及时发现配置异常或即将过期的域名,避免服务中断风险。

http://www.jsqmd.com/news/996577/

相关文章:

  • 离线查询神器:用Tarjan算法+并查集秒杀一堆LCA问题(Python/Java实现)
  • 别让你的SPI Nor跑飞了!100MHz高频下采样延时的实战配置与调试心得
  • Hugging Face Transformers工程实践:从模型加载到生产部署的全链路指南
  • 避坑指南:HPM6750的UART DMA传输,这些细节不注意代码就跑不起来
  • MCP协议:AI工具的USB-C式即插即用通信标准
  • Uboot倒计时被‘脏数据’打断?一个10K上拉电阻拯救你的i.MX8M设备启动稳定性
  • LOINC 2.64版结构化数据包:含Oracle/MySQL建库脚本、CSV字典及批量导入工具
  • 2026年评价高的铜陵GEO排名优化/铜陵AI搜索GEO优化哪家靠谱 - 品牌宣传支持者
  • 2026年长期信赖的湖南畜禽粪污发酵植全素肥料/植全素肥料营养液/植全素生物肥料推荐品牌厂家 - 品牌宣传支持者
  • 从原理到实战:深入理解arp-scan如何帮你‘看见’隐藏的网络设备(Linux/Ubuntu环境)
  • 2026年U型钢辊压成型机优质厂家选择指南:技术路线与工程适配分析 - 优质品牌商家
  • OpenCV图像处理流水线优化:从imread到imencode,一步到位搞定图片压缩与网络传输
  • 别再只当脚本小子:深入理解CVE-2015-9331中时间戳与目录名的生成机制
  • 自指动力学的哈密顿量与拉格朗日量形式(世毫九实验室原创理论)
  • 从电解电容到CPU散热:聊聊硬件工程师眼中的‘浴盆曲线’与产品寿命设计
  • Linux命令:sudo
  • 大模型稀疏激活原理:MoE架构如何实现1.8万亿参数仅2%动态计算
  • 三菱PLC通信选型指南:A-1E vs Qna-3E,你的FX3U和FX5U项目到底该用哪个?
  • C#写的BACnet调试小工具,带图形界面,支持设备发现和属性读写
  • 技术创业中的隐性成本:从技术债务到合规风险的全面审视
  • STM32H743xI性能调优实战:避开多主设备争抢AXI总线的坑,提升DMA2D刷屏效率
  • 3分钟快速上手:OptiScaler游戏画质优化终极指南
  • 机器学习生产化四层治理:从数据契约到模型可观测
  • 同城快递配送员接单App源码(含本地SQLite订单管理)
  • 告别纸上谈兵:用CEVA-BX2 DSP软核,手把手教你搭建5G基带处理仿真环境
  • 从RTP到RTMP:手把手拆解ZLMediaKit中MultiMediaSourceMuxer的协议转换魔法
  • OpenMV图像处理实战:在1.8寸小屏上实时追踪色块并串口输出坐标(避坑QQVGA设置)
  • 从智能音箱到车载通话:拆解3A算法(AEC/ANS/AGC)在不同硬件上的落地挑战
  • 硬件开发者必看:手把手教你基于OCP NVMe SSD v2.5规范设计合规的E1.S/U.2盘
  • 避开理想陷阱:用CGH40010F真实模型优化Doherty功放设计的几个实用技巧