Jak szybko sprawdzić, czy domena istnieje? [duplikować]

Nov 26 2020

Mam dużą listę domen i muszę sprawdzić, czy domeny są teraz dostępne. Robię to tak:

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

Ale czek jest zbyt wolny. Czy jest sposób, aby to przyspieszyć? Może ktoś zna alternatywną metodę sprawdzania istnienia domen?

Odpowiedzi

1 saradartur Nov 26 2020 at 01:55

Jeśli chcesz sprawdzić, które domeny są dostępne, bardziej poprawnym podejściem byłoby wyłapanie ConnectionErrorz requestsmodułu, ponieważ nawet jeśli otrzymasz kod odpowiedzi, którego nie ma 200, fakt, że jest odpowiedź, oznacza, że ​​istnieje serwer powiązany tej domeny. W związku z tym domena jest zajęta.

Nie jest to pełny dowód w zakresie sprawdzania dostępności domeny, ponieważ domena może być zajęta, ale może nie mieć przypisanego odpowiedniego rekordu A lub serwer może być chwilowo wyłączony.

Poniższy kod jest również asynchroniczny.

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

Możesz uruchomić skrypt wiele razy, ale dodać do każdej ograniczoną liczbę domen, aby przyspieszyć działanie.

Mr.lindroid Nov 26 2020 at 00:42

Możesz to zrobić poprzez moduł " request-futures ". request-futures działa asynchronicznie, jeśli masz średnie połączenie internetowe, może sprawdzić 8-10 adresów URL na sekundę (na podstawie moich doświadczeń).

AssadAli Nov 26 2020 at 02:30

Użyj scrapy, jest to znacznie szybsze i domyślnie daje tylko 200 odpowiedzi, dopóki go nie przejedziesz, więc w twoim przypadku idź za mną

pip install scrapy 

Po zainstalowaniu w swoim folderze projektu terminal użytkownika do stworzenia projektu

Scrapy startproject projectname projectdir

Utworzy nazwę folderu projectdir

Teraz

cd projectdir

Wewnątrz projectdir enter

scrapy genspider mydomain mydomain.com

Teraz przejdź do folderu pająków otwórz mydomain.py

Teraz dodaj kilka wierszy kodu

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}

Teraz wróć do projectdir i uruchom

scrapy crawl mydomain -o output.csv

Będziesz mieć wszystkie działające domeny mające kod stanu 200 w pliku output.csv

Więcej patrz

cleder Nov 29 2020 at 18:45

Możesz użyć biblioteki gniazd, aby określić, czy domena ma wpis 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
>>>