Comment vérifier rapidement si le domaine existe? [dupliquer]

Nov 26 2020

J'ai une longue liste de domaines et je dois vérifier si des domaines sont disponibles maintenant. Je le fais comme ça:

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

Mais le contrôle est trop lent. Y a-t-il un moyen de le rendre plus rapide? Peut-être que quelqu'un connaît une méthode alternative pour vérifier l'existence de domaines?

Réponses

1 saradartur Nov 26 2020 at 01:55

Si vous voulez vérifier quels domaines sont disponibles, l'approche la plus correcte serait de capturer le ConnectionErrordu requestsmodule, car même si vous obtenez un code de réponse qui ne l'est pas 200, le fait qu'il y ait une réponse signifie qu'il y a un serveur associé à ce domaine. Par conséquent, le domaine est pris.

Ce n'est pas une preuve complète en termes de vérification de la disponibilité du domaine, car un domaine peut être pris, mais peut ne pas avoir un enregistrement A approprié associé, ou le serveur peut simplement être en panne pour le moment.

Le code ci-dessous est également asynchrone.

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

Ce que vous pouvez faire est d'exécuter le script plusieurs fois, mais n'ajoutez qu'un nombre limité de domaines à chacun pour le rendre rapide.

Mr.lindroid Nov 26 2020 at 00:42

Vous pouvez le faire via le module " demandes-futures ". demandes-futures fonctionne de manière asynchrone, si vous avez une connexion Internet moyenne, il peut vérifier 8 à 10 URL par seconde (selon mon expérience).

AssadAli Nov 26 2020 at 02:30

Utilisez scrapy, c'est beaucoup plus rapide et par défaut, il ne donne que 200 réponses jusqu'à ce que vous le dépassiez, alors dans votre cas, suivez-moi

pip install scrapy 

Après l'installation dans votre terminal utilisateur de dossier de projet pour créer le projet

Scrapy startproject projectname projectdir

Il créera le nom du dossier projectdir

Maintenant

cd projectdir

À l'intérieur de projectdir entrer

scrapy genspider mydomain mydomain.com

Naviguez maintenant vers le dossier des araignées, ouvrez mydomain.py

Maintenant, ajoutez quelques lignes de code

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}

Revenez maintenant à projectdir et exécutez

scrapy crawl mydomain -o output.csv

Vous aurez tous les domaines de travail ayant le code d'état 200 dans le fichier output.csv

Pour en savoir plus, voir

cleder Nov 29 2020 at 18:45

Vous pouvez utiliser la bibliothèque de sockets pour déterminer si un domaine a une entrée 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
>>>