2015-07-23 1 views
3

J'utilise pywhois pour déterminer si un nom de domaine est enregistré ou non. Voici mon code source. (Toutes les permutations de a.net à zzz.net)Comment savoir si un programme nom de domaine est enregistré ou non

#!/usr/bin/env python 
import whois #pip install python-whois 
import string 
import itertools 

def main(): 
    characters = list(string.ascii_lowercase) 
    ##domain names generator 
    for r in range(1, 4) : 
     for name in itertools.permutations(characters, r) : #from 'a.net' to 'zzz.net' 
      url = ''.join(name) + '.net' 

      #check if a domain name is registered or not 
      try : 
       w = whois.whois(url) 
      except (whois.parser.PywhoisError): #NOT FOUND 
       print(url) #unregistered domain names? 

if __name__ == '__main__': 
    main() 

J'ai obtenu les résultats suivants:

jv.net 
uli.net 
vno.net 
xni.net 

Cependant, tous au-dessus des noms de domaine ont déjà été enregistrés. Ce n'est pas exact. Quelqu'un peut-il l'expliquer? Il y a beaucoup d'erreurs:

fgets: Connection reset by peer 
connect: No route to host 
connect: Network is unreachable 
connect: Connection refused 
Timeout. 

Il y a une autre façon, a rapporté here.

import socket 
try:  
    socket.gethostbyname_ex(url) 
except: 
    print(url) #unregistered domain names? 

En parlant de vitesse, j'utilise map à traitement parallèle.

def select_unregisteredd_domain_names(self, domain_names): 
    #Parallelism using map 
    pool = ThreadPool(16) # Sets the pool size 
    results = pool.map(query_method(), domain_names) 
    pool.close() #close the pool and wait for the work to finish 
    pool.join() 

    return results 
+1

À moins que quelque chose ne me manque, votre code ne comprend que des erreurs. Cela ne signifie pas nécessairement qu'aucun enregistrement n'a été trouvé; il pourrait s'agir d'un problème de réseau ou d'un certain nombre d'autres problèmes. –

+0

@EdCottrell Comment corriger mes codes? – SparkAndShine

+1

Je ne sais pas quoi vous dire, car je ne connais pas très bien le phwhois. C'est pourquoi j'ai posté un commentaire au lieu d'une réponse.Vous devez examiner l'erreur de plus près pour déterminer les raisons de l'échec. Bonne chance! –

Répondre

15

C'est un problème difficile à résoudre, plus délicat que la plupart des gens ne le pensent. La raison en est que certaines personnes ne veulent pas que vous le sachiez. La plupart des registrars de domaine appliquent beaucoup de magie noire (c'est-à-dire beaucoup de hacks spécifiques au TLD) pour obtenir les listes intéressantes qu'ils fournissent, et souvent ils se trompent. Bien sûr, à la fin, ils sauront avec certitude, car ils ont EPP accès qui contiendra la réponse officielle (mais c'est généralement fait seulement lorsque vous cliquez sur "commander").

Votre première méthode (whois) utilisé pour être un bon, et je l'ai fait sur une grande échelle dans les années 90 où tout était plus ouvert. De nos jours, de nombreux TLD protègent cette information derrière les captchas et les interfaces web obstructives, et ainsi de suite. Si rien d'autre, il y aura des quotas sur le nombre de requêtes par IP. (Et c'est peut-être pour une bonne raison aussi, j'avais l'habitude d'obtenir des quantités ridicules de spam aux adresses électroniques utilisées pour enregistrer des domaines). Notez également que spammer leurs bases de données WHOIS avec des requêtes est généralement en violation de leurs conditions d'utilisation et vous pourriez obtenir un tarif limité, bloqué, ou même obtenir un rapport d'abus à votre fournisseur de services Internet.

Votre deuxième méthode (DNS) est généralement beaucoup plus rapide (mais ne pas utiliser gethostbyname, utilisez Twisted ou un autre async DNS pour l'efficacité). Vous devez déterminer la manière dont la réponse pour les domaines pris et libre apparaît pour chaque TLD. Juste parce qu'un domaine ne résout pas ne signifie pas qu'il est gratuit (il pourrait juste être inutilisé). Et inversement, certains TLD ont des pages de destination pour tous les domaines non existants. Dans certains cas, il sera impossible de déterminer en utilisant le DNS seul.

Alors, comment résolvez-vous? Pas avec aisance, j'en ai peur. Pour chaque TLD, vous devez comprendre comment utiliser intelligemment les bases de données DNS et whois, en commençant par le DNS et en ayant recours à d'autres moyens dans les cas difficiles. Assurez-vous de ne pas inonder les bases de données whois avec des requêtes.

Une autre option est d'obtenir un accès API à l'un des bureaux d'enregistrement, ils pourraient offrir un accès programmatique à la recherche de domaine.

+4

Très belle réponse. – SparkAndShine

+0

@SparkAndShine Alors, comment avez-vous finalement réussi à résoudre ce problème? – meetpd

+0

@meetpd, je n'ai pas trouvé de meilleure solution pour le moment :-( – SparkAndShine