Wie kann ich schnell überprüfen, ob eine Domain vorhanden ist? [Duplikat]
Ich habe eine große Liste von Domains und muss überprüfen, ob Domains jetzt verfügbar sind. So mach ich es:
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} [---]')
Aber die Prüfung ist zu langsam. Gibt es eine Möglichkeit, es schneller zu machen? Vielleicht kennt jemand eine alternative Methode, um Domains auf Existenz zu überprüfen?
Antworten
Wenn Sie überprüfen möchten, welche Domänen verfügbar sind, besteht der korrektere Ansatz darin, die ConnectionError
vom requests
Modul abzufangen, denn selbst wenn Sie einen Antwortcode erhalten, der nicht vorhanden ist 200
, bedeutet die Tatsache, dass eine Antwort vorliegt, dass ein Server zugeordnet ist diese Domain. Daher wird die Domain übernommen.
Dies ist kein vollständiger Beweis für die Überprüfung der Domänenverfügbarkeit, da eine Domäne möglicherweise belegt ist, jedoch möglicherweise kein geeigneter A-Datensatz zugeordnet ist oder der Server vorerst nur ausfällt.
Der folgende Code ist ebenfalls asynchron.
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)
Sie können das Skript mehrmals ausführen, aber jeweils nur eine begrenzte Anzahl von Domänen hinzufügen, um es schneller zu machen.
Sie können dies über das Modul " Anfragen-Futures " tun . Anfragen-Futures werden asynchron ausgeführt. Wenn Sie eine durchschnittliche Internetverbindung haben, können 8 bis 10 URLs pro Sekunde überprüft werden (basierend auf meiner Erfahrung).
Verwenden Sie Scrapy, es ist viel schneller und standardmäßig gibt es nur 200 Antworten, bis Sie es überfahren, also folgen Sie mir in Ihrem Fall
pip install scrapy
Nach der Installation in Ihrem Projektordner Benutzerterminal zum Erstellen des Projekts
Scrapy startproject projectname projectdir
Es wird der Ordnername projectdir erstellt
Jetzt
cd projectdir
Innerhalb des Projektverzeichnisses eingeben
scrapy genspider mydomain mydomain.com
Navigieren Sie nun zum Spinnenordner und öffnen Sie mydomain.py
Fügen Sie nun einige Codezeilen hinzu
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}
Nun zurück zu projectdir und ausführen
scrapy crawl mydomain -o output.csv
In der Datei output.csv befinden sich alle Arbeitsdomänen mit dem Statuscode 200
Weitere Informationen finden Sie unter
Mithilfe der Socket-Bibliothek können Sie feststellen, ob eine Domain einen DNS-Eintrag hat:
>>> 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
>>>