ドメインが存在するかどうかをすばやく確認するにはどうすればよいですか?[複製]

Nov 26 2020

ドメインのリストがたくさんあるので、ドメインが利用可能かどうかを確認する必要があります。私はこのようにします:

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

しかし、チェックは遅すぎます。それを速くする方法はありますか?たぶん誰かがドメインの存在をチェックするための別の方法を知っていますか?

回答

1 saradartur Nov 26 2020 at 01:55

使用可能なドメインを確認する場合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)
David Nov 26 2020 at 00:26

スクリプトを複数回実行しますが、高速にするために、それぞれに限られた量のドメインのみを追加します。

Mr.lindroid Nov 26 2020 at 00:42

これは、「requests-futures」モジュールを介して行うことができます。requests-futuresは非同期で実行されます。平均的なインターネット接続がある場合は、1秒あたり8〜10のURLをチェックできます(私の経験に基づく)。

AssadAli Nov 26 2020 at 02:30

スクレイプを使用すると、はるかに高速になり、デフォルトでは、乗り越えるまで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のすべての作業ドメインがあります

詳細については、

cleder Nov 29 2020 at 18:45

ソケットライブラリを使用して、ドメインに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
>>>