Wie kann ich schnell überprüfen, ob eine Domain vorhanden ist? [Duplikat]

Nov 26 2020

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

1 saradartur Nov 26 2020 at 01:55

Wenn Sie überprüfen möchten, welche Domänen verfügbar sind, besteht der korrektere Ansatz darin, die ConnectionErrorvom requestsModul 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)
David Nov 26 2020 at 00:26

Sie können das Skript mehrmals ausführen, aber jeweils nur eine begrenzte Anzahl von Domänen hinzufügen, um es schneller zu machen.

Mr.lindroid Nov 26 2020 at 00:42

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

AssadAli Nov 26 2020 at 02:30

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

cleder Nov 29 2020 at 18:45

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