Jak szybko sprawdzić, czy domena istnieje? [duplikować]
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
Jeśli chcesz sprawdzić, które domeny są dostępne, bardziej poprawnym podejściem byłoby wyłapanie ConnectionError
z requests
moduł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)
Możesz uruchomić skrypt wiele razy, ale dodać do każdej ograniczoną liczbę domen, aby przyspieszyć działanie.
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ń).
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
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
>>>