도메인이 있는지 빠르게 확인하는 방법은 무엇입니까? [복제]
도메인 목록이 많고 지금 도메인을 사용할 수 있는지 확인해야합니다. 나는 이것을 이렇게한다 :
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} [---]')
그러나 수표가 너무 느립니다. 더 빨리 만들 수있는 방법이 있습니까? 누군가가 도메인의 존재를 확인하는 다른 방법을 알고 있습니까?
답변
사용할 수있는 도메인을 확인하려는 경우 더 정확한 접근 방식은 모듈 ConnectionError
에서 를 잡는 것 requests
입니다..이 아닌 응답 코드를 받더라도 응답 200
이 있다는 사실은 다음과 관련된 서버가 있음을 의미하기 때문입니다. 그 도메인. 따라서 도메인이 사용됩니다.
이것은 도메인 가용성을 확인하는 측면에서 완전한 증거가 아닙니다. 도메인을 사용할 수 있지만 적절한 A 레코드가 연결되어 있지 않거나 서버가 당분간 중단 될 수 있기 때문입니다.
아래 코드도 비동기식입니다.
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)
할 수있는 일은 스크립트를 여러 번 실행하되 속도를 높이기 위해 각각에 제한된 양의 도메인 만 추가하는 것입니다.
" requests-futures "모듈 을 통해 그렇게 할 수 있습니다 . requests-futures는 비동기 적으로 실행됩니다. 평균 인터넷 연결이있는 경우 초당 8 ~ 10 개의 URL을 확인할 수 있습니다 (내 경험에 따라).
스크래피를 사용하면 훨씬 빠르며 기본적으로 오버 라이딩 할 때까지 200 개의 응답 만 나오므로 귀하의 경우에는 나를 따르십시오
pip install scrapy
프로젝트 폴더 사용자 터미널에 설치 후 프로젝트 생성
Scrapy startproject projectname projectdir
폴더 이름 projectdir을 생성합니다.
지금
cd projectdir
projectdir 내부 입력
scrapy genspider mydomain mydomain.com
이제 spiders 폴더로 이동하여 mydomain.py를 엽니 다.
이제 몇 줄의 코드를 추가하십시오.
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}
이제 projectdir로 돌아가서 실행하십시오.
scrapy crawl mydomain -o output.csv
output.csv 파일에 상태 코드 200이있는 모든 작업 도메인이 있습니다.
자세한 내용 은
소켓 라이브러리를 사용하여 도메인에 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
>>>