ドメインが存在するかどうかをすばやく確認するにはどうすればよいですか?[複製]
ドメインのリストがたくさんあるので、ドメインが利用可能かどうかを確認する必要があります。私はこのようにします:
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は非同期で実行されます。平均的なインターネット接続がある場合は、1秒あたり8〜10のURLをチェックできます(私の経験に基づく)。
スクレイプを使用すると、はるかに高速になり、デフォルトでは、乗り越えるまで200の応答しか得られないので、あなたの場合は私に従ってください
pip install scrapy
プロジェクトを作成するためにプロジェクトフォルダのユーザーターミナルにインストールした後
Scrapy startproject projectname projectdir
それはフォルダ名projectdirを作成します
今
cd projectdir
projectdir内に入力します
scrapy genspider mydomain mydomain.com
次に、スパイダーフォルダに移動して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
>>>