2015-05-24 52 views
1

我有一個腳本可以過濾那些還沒有註冊的域名。我使用pywhois模塊。問題在於它在數次(有時是數百次)請求之後突然凍結並且什麼都不做。我認爲這不是禁令,因爲我可以在凍結之後立即運行程序,並且它可以正常工作。如何避免在連接到服務器時程序被凍結

我想避免這種凍結。我的想法是計算函數的運行時間,如果時間跨越某行(例如10秒),它會重複該代碼。

你有什麼建議如何避免凍結?或者更好的方法來檢查域名?

下面是代碼:

for keyword in keywords: 
     try: 
      details = pythonwhois.get_whois(keyword+'.com') 
     except Exception as e: 
      print e 
      continue 
     if 'status' not in details.keys(): 
      print 'Free domain!' 
      print keyword 
+0

可以在for循環 – Ajay

+0

@Ajay的問題可能不會加載開始時添加time.sleep,但註冊的域名,其服務器不正確響應。 – JDong

+0

@JDong你有什麼想法如何跳轉到下一個關鍵字?謝謝 –

回答

3

這種方法容易改變(如底層庫的變化),但是,你可以調用內部套接字函數爲所有pythonwhois網絡調用設置超時。例如:

TIMEOUT = 5.0 # timeout in seconds 
pythonwhois.net.socket.setdefaulttimeout(TIMEOUT) 
pythonwhois.get_whois("example.com") 
+1

是的,這種方法應該適合你,@米蘭。 – JDong

+0

非常感謝你們!這是我正在尋找的解決方案。 –

0

也許你可以試試dnspython。它看起來像你只是想檢查一個域名是否被註冊。例如:

import dns.resolver 

for keyword in keywords: 
    try: 
     dns.resolver.query(keyword+'.com') 
    except dns.resolver.NXDOMAIN: 
     print(keyword+'.com is available!') 

DNS解析程序的默認超時時間爲2秒。如果你想改變它,你可以使用不同的timeout來創建dns.resolver.Resolver的新實例。

爲了使多線程,線程池將是最好的選擇,如果你可以使用python3:

from multiprocessing import Pool 

def check_keyword(keyword): 
    try: 
     dns.resolver.query(keyword+'.com') 
    except dns.resolver.NXDOMAIN: 
     # You probably want to change this to a return 
     print(keyword+'.com is available!') 

if __name__ == '__main__': 
    keywords = [...] 
    p = Pool(5) 
    print(p.map(check_keyword, keywords)) 
+0

感謝您的回覆,但這不能正常工作。例如321000.com據稱還沒有註冊,但它是。 –

+1

嗯,看起來像你必須使用'whois'。我會尋找超時的whois python庫。 – JDong

相關問題