【问题标题】:Testing domain-name availability with pythonwhois使用 pythonwhois 测试域名可用性
【发布时间】:2017-11-21 16:32:22
【问题描述】:

我正在成功使用pythonwhois(与pip install ...一起安装)来检查.com域的可用性:

import pythonwhois
for domain in ['aaa.com', 'bbb.com', ...]:
    details = pythonwhois.get_whois(domain)
    if 'No match for' in str(details):   # simple but it works!
        print domain 

但是:

  • 有点慢(平均每秒 2 个请求)
  • 如果我执行 26*26*26 ~ 17000 个请求,我不会被whois 服务器列入黑名单吗?
    (我正在测试???mail.com 的可用性,?a..z

问题:有没有比每个域执行一个whois 请求更好的方法来检查可用性?


编辑:截至 2017 年 11 月,这项工作在 9572 秒内完成,所有可用域中的 here is the full list 格式为 ???mail.com,如果有人有兴趣启动电子邮件服务!

【问题讨论】:

    标签: python domain-name whois


    【解决方案1】:

    你应该并行化你正在做的事情。由于您的函数花费的大部分时间都在等待,因此您可以一次验证大量工作(不限于您的处理器数量)。示例:

    import pythonwhois
    from joblib import Parallel, delayed, cpu_count
    n_jobs = 100 # works in parallel
    def f(domain):
        details = pythonwhois.get_whois(domain)
        if 'No match for' in str(details):   # simple but it works!
            print(domain)
            return domain
        else:
            return None
    
    domains= ['aaa.com', 'bbb.com', 'ccc.com', 'bbbaohecraoea.com']
    result = Parallel(n_jobs=n_jobs, verbose=10)(delayed(f)(domain) for domain in domains)
    
    # create a list with the available domains
    available_domains=[domains[idx] for idx,r in enumerate(result) if r!=None]
    print(available_domains)
    # Result
    # ['bbbaohecraoea.com']
    

    【讨论】:

    • 哇,这看起来很不错,我以前从未使用过Parallel! (只是您的代码有一个错误:ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not support forking. To use parallel-computing in a script, you must protect your main loop using "if __name__ == '__main__'". Please see the joblib documentation on Parallel for more information)(我在 Windows 上使用 Python 2.7)。
    • 所以我添加了if __name__ == '__main__':,然后它运行了,但是我除了[Parallel(n_jobs=10)]: Done 5 tasks | elapsed: 1.7s [Parallel(n_jobs=10)]: Done 12 tasks | elapsed: 2.1s [Parallel(n_jobs=10)]: Done 21 tasks | elapsed: 2.5s [Parallel(n_jobs=10)]: Done 30 tasks | elapsed: 2.6s之外没有其他输出。关于如何实际显示结果的任何想法?我认为print 没有任何作用。
    • 我添加了一些代码来向您展示可用的域。另外,就我而言,导入时没有错误。可能是版本问题什么的。
    • 哦,我明白了,它不是即时显示的,但最后,在打印 result... 之前有没有办法动态打印域(同时这样做)结束? f() 中的 print(domain) 似乎没有显示。
    • 可能是因为你使用的版本。使用我在 linux 下的版本,它可以工作。但你感兴趣的只是结果。只是为了玩,我创建了another script,它创建了 10000 个随机字符串并检查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多