¿Cómo comprobar rápidamente si existe un dominio? [duplicar]
Tengo una gran lista de dominios y necesito comprobar si los dominios están disponibles ahora. Lo hago así:
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} [---]')
Pero la verificación es demasiado lenta. ¿Hay alguna forma de hacerlo más rápido? ¿Quizás alguien conozca un método alternativo para verificar la existencia de dominios?
Respuestas
Si desea verificar qué dominios están disponibles, el enfoque más correcto sería capturar el ConnectionErrordel requestsmódulo, porque incluso si obtiene un código de respuesta que no lo está 200, el hecho de que haya una respuesta significa que hay un servidor asociado con ese dominio. Por tanto, se toma el dominio.
Esto no es una prueba completa en términos de verificación de la disponibilidad del dominio, porque un dominio puede ser tomado, pero puede que no tenga el registro A apropiado asociado, o el servidor puede estar inactivo por el momento.
El siguiente código también es asincrónico.
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)
Lo que puede hacer es ejecutar el script varias veces pero agregar solo una cantidad limitada de dominios a cada uno para que sea más rápido.
Puede hacerlo a través del módulo " solicitudes-futuros ". Las solicitudes de futuros se ejecutan de forma asincrónica. Si tiene una conexión a Internet promedio, puede verificar entre 8 y 10 URL por segundo (según mi experiencia).
Usar scrapy es mucho más rápido y, de forma predeterminada, solo produce 200 respuestas hasta que lo sobrepases, así que en tu caso sígueme
pip install scrapy
Después de instalar en el terminal de usuario de la carpeta del proyecto para crear el proyecto
Scrapy startproject projectname projectdir
Creará el nombre de la carpeta projectdir
Ahora
cd projectdir
Dentro de projectdir enter
scrapy genspider mydomain mydomain.com
Ahora navegue a la carpeta de arañas, abra mydomain.py
Ahora agregue algunas líneas de código
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}
Ahora vuelve a projectdir y ejecuta
scrapy crawl mydomain -o output.csv
Tendrá todos los dominios de trabajo con código de estado 200 en el archivo output.csv
Para más ver
Puede utilizar la biblioteca de sockets para determinar si un dominio tiene una entrada 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
>>>