0

0

Python多进程加速:高效批量检测域名可用性

DDD

DDD

发布时间:2025-10-24 13:06:33

|

280人浏览过

|

来源于php中文网

原创

python多进程加速:高效批量检测域名可用性

本文详细阐述如何利用Python的`multiprocessing`模块与`python-whois`库,高效地批量检测大量域名的可用性。通过引入并行处理机制,该方法能够显著克服传统`whois`查询的性能瓶颈,实现每秒处理数十个域名的速度,并提供清晰的可用性报告,是处理大规模域名列表的理想解决方案。

1. 挑战:传统WHOIS查询的效率瓶颈

在需要批量检测数万个域名可用性时,传统的串行whois查询方法效率极低。例如,直接使用python-whois库进行循环查询,可能需要数年才能完成50,000个域名的检测,这在实际应用中是不可接受的。其主要原因在于每次whois查询都涉及网络请求,耗时相对较长,且通常是I/O密集型操作,而非CPU密集型。

2. 解决方案:利用Python多进程加速

为了解决串行whois查询的效率问题,我们可以利用Python的multiprocessing模块实现并行处理。multiprocessing允许程序创建独立的进程,每个进程在自己的解释器中运行,从而可以充分利用多核CPU资源,同时进行多个whois查询,大幅提升处理速度。这种方式尤其适用于I/O密集型任务,因为当一个进程等待网络响应时,其他进程可以继续执行查询。

3. 实现步骤与代码示例

以下是使用multiprocessing和python-whois进行批量域名可用性检测的详细实现。

立即学习Python免费学习笔记(深入)”;

3.1 准备工作:安装所需库

首先,确保安装了所有必要的Python库:python-whois用于查询WHOIS信息,pandas用于数据处理和结果展示,tqdm用于显示任务进度。

网趣网上购物系统HTML静态版
网趣网上购物系统HTML静态版

网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使

下载
pip install python-whois pandas tqdm

3.2 核心函数:单域名检测与输出抑制

check_domain函数负责查询单个域名的WHOIS信息并判断其可用性。为了避免python-whois库在每次查询时打印大量调试信息到标准输出,我们引入了blockPrint和enablePrint函数来临时重定向标准输出。

import os
import sys
from multiprocessing import Pool

import pandas as pd
from tqdm import tqdm
from whois import whois

# 辅助函数:抑制whois库的输出
def blockPrint():
    """将标准输出重定向到空设备,抑制whois的冗余输出。"""
    sys.stdout = open(os.devnull, "w")

# 辅助函数:恢复标准输出
def enablePrint():
    """恢复标准输出到原始的sys.stdout。"""
    sys.stdout = sys.__stdout__

def check_domain(domain):
    """
    检查单个域名的可用性。
    :param domain: 待检查的域名字符串。
    :return: 元组 (域名, 是否可用)。如果查询失败或遇到异常,返回 (域名, None)。
    """
    try:
        blockPrint() # 抑制whois输出
        result = whois(domain)
    except Exception as e:
        # 捕获whois查询可能抛出的异常,如无效域名格式、网络问题等
        # print(f"Error checking {domain}: {e}", file=sys.__stdout__) # 可选:打印错误到原始stdout
        return domain, None # 查询失败,返回None
    finally:
        enablePrint() # 无论成功或失败,都恢复标准输出

    # 根据whois查询结果判断域名状态
    # whois库通常在域名被占用时返回status字段。如果status为空、为"free"或未找到,则认为可用。
    # 注意:不同的TLD和whois服务器可能返回不同的status信息,这里简化处理。
    # 实际应用中可能需要更复杂的逻辑来解析status字段,例如检查"No match for"等关键字。
    is_free = not bool(result.status) if result and result.status else True
    return domain, is_free

说明:

  • blockPrint()和enablePrint():这两个辅助函数是关键,它们通过重定向sys.stdout来临时禁用标准输出。python-whois库在执行查询时可能会输出大量日志信息,这在多进程环境下会造成混乱并影响性能。
  • check_domain(domain):该函数封装了whois查询逻辑。它在查询前后调用blockPrint()和enablePrint()。通过检查result.status字段,判断域名是否已被注册。如果status非空,通常表示域名已被占用;否则,被认为是可用的。try-except-finally结构确保了即使单个域名查询失败,也不会中断整个批处理过程,并且标准输出总能被恢复。

3.3 主程序:多进程池与结果收集

在主程序中,我们创建了一个multiprocessing.Pool来管理并发进程,并使用tqdm库为用户提供直观的进度条。

if __name__ == "__main__":
    # 示例域名列表(实际应用中替换为您的50k域名列表)
    # 为了模拟大量数据,这里将一个小型列表重复多次
    domains_to_check = [
        "google.com",
        "yahoo.com",
        "facebook.com",
        "xxxnonexistentzzz.domain", # 示例:一个很可能不存在的域名
        "example.com",
        "anotherexample.org",
        "availabledomain.net",
        "occupied.info"
    ] * 5000 # 模拟一个包含40,000个域名的较大列表

    results = []
    # 创建进程池,processes参数可根据CPU核心数和网络条件调整
    # 建议设置为CPU核心数的1-2倍,或根据实际测试选择最佳值
    # 例如,对于8核CPU,可以尝试设置为8到16个进程
    with Pool(processes=16) as pool: 
        # 使用imap_unordered可以无序地获取结果,提高效率,并结合tqdm显示进度
        for domain, is_free in tqdm(
            pool.imap_unordered(check_domain, domains_to_check), 
            total=len(domains_to_check),
            desc="Checking Domains Availability" # 进度条描述
        ):
            if is_free is not None: # 仅添加成功查询的域名(即is_free不是None)
                results.append((domain, is_free))

    # 将结果转换为DataFrame并去重,方便查看和分析
    df = pd.DataFrame(results, columns=["domain", "is_free"])
    print("\n--- 域名可用性检测结果 ---")
    # 打印去重并按域名排序的结果
    print(df.drop_duplicates().sort_values(by="domain"))

说明:

  • domains_to_check:这是您的域名列表,可以从文件或其他数据源加载。在示例中,我们通过重复一个小型列表来模拟一个大规模列表。
  • Pool(processes=16):这里创建了一个包含16个工作进程的进程池。您可以根据系统资源(CPU核心数、网络带宽)和实际测试结果调整此数值。过多的进程可能会导致上下文切换开销增加,或被WHOIS服务器限速。
  • pool.imap_unordered(check_domain, domains_to_check):这个方法将domains_to_check列表中的每个域名作为参数,分发给进程池中的工作进程并行执行check_domain函数。imap_unordered的优点是它会在结果可用时立即返回,而不必等待所有先前的任务完成,这对于进度条显示非常友好。
  • tqdm:提供了一个美观的进度条,让用户了解任务的执行进度,包括已完成数量、总数和每秒处理速度。
  • 结果处理:将收集到的结果 ((domain, is_free)) 存储在results列表中,最后通过pandas.DataFrame进行整理和去重,并按域名排序,输出清晰的可用性报告。

4. 性能与注意事项

  • 性能表现: 经过测试,使用此多进程方法,可以达到每秒检测约50-60个域名的速度。对于50,000个域名,预计可在15-20分钟内完成检测,相较于串行方法,效率提升显著。
  • 进程数选择: Pool中的processes参数是关键。过少会浪费CPU资源,过多则可能导致资源争抢、上下文切换开销,甚至被WHOIS服务器识别为DDoS攻击而临时封禁IP。建议从CPU核心数开始测试,逐步调整至最佳值,通常是CPU核心数的1到2倍。
  • WHOIS服务器限制: 频繁的WHOIS查询可能会触发某些WHOIS服务器的速率限制或IP封禁。如果遇到此类问题,可能需要引入延时(例如在check_domain函数中加入time.sleep())、使用代理IP池或分散查询时间。本示例未包含这些高级策略,但在大规模生产环境中需考虑。
  • 域名价格查询: 原始问题中提到了价格查询。python-whois库主要提供域名注册信息和状态,通常不直接提供域名注册价格。域名价格由注册商决定,并且会因TLD、注册期限、促销活动等因素而异。要获取价格,通常需要查询特定的域名注册商API(如GoDaddy API、Namecheap API等),这超出了WHOIS协议的能力范围。
  • 错误处理: check_domain函数中包含了基本的异常处理,但对于更复杂的网络错误或WHOIS服务器响应异常,可能需要更健壮的错误重试机制或更详细的错误日志记录。
  • WHOIS数据解析: 不同的TLD(顶级域名)的WHOIS服务器返回的数据格式可能略有不同,python-whois库已经做了很好的封装,但在某些边缘情况下,result.status的判断逻辑可能需要根据实际情况微调,以确保准确性。

5. 总结

通过结合Python的multiprocessing模块和python-whois库,我们成功构建了一个高效的批量域名可用性检测工具。该方法通过并行处理克服了传统串行查询的性能瓶颈,极大地缩短了处理大规模域名列表所需的时间。尽管本教程主要关注可用性检测,但其多进程并行处理的思想可推广应用于其他需要大量I/O密集型操作的场景。在实际应用中,请根据您的具体需求和网络环境,合理配置进程数,并考虑潜在的速率限制问题,以确保程序的稳定性和高效性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

56

2025.12.04

ddos攻击工具有哪些
ddos攻击工具有哪些

ddos攻击工具有LOIC、HOIC、Slowloris、ICMP洪水攻击、SYN洪水攻击和UDP洪水攻击。详细介绍:1、LOIC,可以使用单个用户或多个用户协同工作,形成分布式攻击,从而增加攻击的威力;2、HOIC,可以使用多个代理服务器,从而隐藏攻击者的真实IP地址;3、Slowloris,通过发送大量的半连接请求来占用目标服务器的资源,从而使其无法处理其他合法的连接请求等等。

479

2023.10.09

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

138

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

7

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

6

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

122

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号