¿Cómo comprobar rápidamente si existe un dominio? [duplicar]

Nov 26 2020

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

1 saradartur Nov 26 2020 at 01:55

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)
David Nov 26 2020 at 00:26

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.

Mr.lindroid Nov 26 2020 at 00:42

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).

AssadAli Nov 26 2020 at 02:30

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

cleder Nov 29 2020 at 18:45

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
>>>