Como verificar rapidamente se o domínio existe? [duplicado]

Nov 26 2020

Tenho uma grande lista de domínios e preciso verificar se os domínios estão disponíveis agora. Eu faço assim:

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} [---]')

Mas a verificação é muito lenta. Existe uma maneira de torná-lo mais rápido? Talvez alguém conheça um método alternativo para verificar a existência de domínios?

Respostas

1 saradartur Nov 26 2020 at 01:55

Se você quiser verificar quais domínios estão disponíveis, a abordagem mais correta seria capturar o ConnectionErrordo requestsmódulo, porque mesmo se você obtiver um código de resposta que não esteja 200, o fato de haver uma resposta significa que há um servidor associado a esse domínio. Portanto, o domínio é assumido.

Isso não é uma prova completa em termos de verificação da disponibilidade do domínio, porque um domínio pode ser adquirido, mas pode não ter um registro A apropriado associado a ele ou o servidor pode estar inativo por enquanto.

O código abaixo também é assíncrono.

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

O que você pode fazer é executar o script várias vezes, mas adicionar apenas uma quantidade limitada de domínios a cada um para torná-lo mais rápido.

Mr.lindroid Nov 26 2020 at 00:42

Você pode fazer isso por meio do módulo " pedidos-futuros ". O request-futures roda de forma assíncrona. Se você tiver uma conexão média com a internet, ele pode verificar 8-10 url por segundo (com base na minha experiência).

AssadAli Nov 26 2020 at 02:30

Usar o scrapy é muito mais rápido e por padrão produz apenas 200 respostas até que você mude, então no seu caso me siga

pip install scrapy 

Depois de instalar em seu terminal de usuário de pasta de projeto para criar o projeto

Scrapy startproject projectname projectdir

Irá criar uma pasta com o nome projectdir

Agora

cd projectdir

Dentro do diretório do projeto, digite

scrapy genspider mydomain mydomain.com

Agora navegue até a pasta spiders abra mydomain.py

Agora adicione algumas linhas 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}

Agora, de volta ao projectdir e execute

scrapy crawl mydomain -o output.csv

Você terá todos os domínios de trabalho com código de status 200 no arquivo output.csv

Para mais veja

cleder Nov 29 2020 at 18:45

Você pode usar a biblioteca de soquetes para determinar se um domínio tem uma 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
>>>