Comment vérifier rapidement si le domaine existe? [dupliquer]
J'ai une longue liste de domaines et je dois vérifier si des domaines sont disponibles maintenant. Je le fais comme ça:
import requests
list_domain = ['google.com', 'facebook.com']
for domain in list_domain:
result = requests.get(f'http://{domain}', timeout=10)
if result.status_code == 200:
print(f'Domain {domain} [+++]')
else:
print(f'Domain {domain} [---]')
Mais le contrôle est trop lent. Y a-t-il un moyen de le rendre plus rapide? Peut-être que quelqu'un connaît une méthode alternative pour vérifier l'existence de domaines?
Réponses
Si vous voulez vérifier quels domaines sont disponibles, l'approche la plus correcte serait de capturer le ConnectionError
du requests
module, car même si vous obtenez un code de réponse qui ne l'est pas 200
, le fait qu'il y ait une réponse signifie qu'il y a un serveur associé à ce domaine. Par conséquent, le domaine est pris.
Ce n'est pas une preuve complète en termes de vérification de la disponibilité du domaine, car un domaine peut être pris, mais peut ne pas avoir un enregistrement A approprié associé, ou le serveur peut simplement être en panne pour le moment.
Le code ci-dessous est également asynchrone.
from concurrent.futures import ThreadPoolExecutor
import requests
from requests.exceptions import ConnectionError
def validate_existence(domain):
try:
response = requests.get(f'http://{domain}', timeout=10)
except ConnectionError:
print(f'Domain {domain} [---]')
else:
print(f'Domain {domain} [+++]')
list_domain = ['google.com', 'facebook.com', 'nonexistent_domain.test']
with ThreadPoolExecutor() as executor:
executor.map(validate_existence, list_domain)
Ce que vous pouvez faire est d'exécuter le script plusieurs fois, mais n'ajoutez qu'un nombre limité de domaines à chacun pour le rendre rapide.
Vous pouvez le faire via le module " demandes-futures ". demandes-futures fonctionne de manière asynchrone, si vous avez une connexion Internet moyenne, il peut vérifier 8 à 10 URL par seconde (selon mon expérience).
Utilisez scrapy, c'est beaucoup plus rapide et par défaut, il ne donne que 200 réponses jusqu'à ce que vous le dépassiez, alors dans votre cas, suivez-moi
pip install scrapy
Après l'installation dans votre terminal utilisateur de dossier de projet pour créer le projet
Scrapy startproject projectname projectdir
Il créera le nom du dossier projectdir
Maintenant
cd projectdir
À l'intérieur de projectdir entrer
scrapy genspider mydomain mydomain.com
Naviguez maintenant vers le dossier des araignées, ouvrez mydomain.py
Maintenant, ajoutez quelques lignes de code
import scrapy
class MydomainSpider(scrapy.Spider):
name = "mydomain"
def start_requests(self):
urls = [
'facebook.com',
'Google.com',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
yield { ‘Available_Domains’ : response.url}
Revenez maintenant à projectdir et exécutez
scrapy crawl mydomain -o output.csv
Vous aurez tous les domaines de travail ayant le code d'état 200 dans le fichier output.csv
Pour en savoir plus, voir
Vous pouvez utiliser la bibliothèque de sockets pour déterminer si un domaine a une entrée DNS:
>>> import socket
>>>
>>> addr = socket.gethostbyname('google.com')
>>> addr
'74.125.193.100'
>>> socket.gethostbyname('googl42652267e.com')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known
>>>