Como verificar rapidamente se o domínio existe? [duplicado]
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
Se você quiser verificar quais domínios estão disponíveis, a abordagem mais correta seria capturar o ConnectionError
do requests
mó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)
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.
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).
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
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
>>>