1

ドメイン名がDNS経由でそのIPアドレスに解決されるかどうかを確認するスクリプトを考え出そうとしています。私が書いたPythonスクリプトを使用します。

いくつかの順次ループでこれを実行できるようにしたいのですが、ループを1回実行しようとした後、2回目にスクリプトを実行すると、以前はDNS解決応答が成功した名前が返されませんでした。

以下は私のスクリプトです:

#! C:\Python27
import socket,time

localtime = time.asctime( time.localtime(time.time()) )


def hostres(hostname):
    print "Attempting to resolve " + hostname 
    try:
        socket.gethostbyname(hostname)
        print "Resolved Successfully!"
    except socket.error:
        print "Could Not Resolve"

print "*************************************************"
print "Website loop starting.."
print "Local current time :", localtime
print "*************************************************"
print ""

text_file = open("sites.txt", "r")
lines = text_file.readlines()
for line in lines:
    hostres(line)
text_file.close()

テキストファイルの内容は次のとおりです。

www.google.com
en.wikipedia.org
www.youtube.com
us.gamespot.com

これらのドメインサーバーがスクリプトを正当なエンドユーザーではなく「ボット」として認識することと関係があると思いますが、これを想定するのは正しいでしょうか。

もしそうなら、ウェブサイトの名前(またはIPは関係ありません)を検索してDNS名が解決するかどうかを確認し、「リクエストが失敗しました」という誤った読み取りを取得せずにこれを実行できるようにするにはどうすればよいですか?サービスはブラウザから完全にアクセスできますか?

4

1 に答える 1

1

この質問にはいくつかの問題があります。

  1. DNS解決をテストしている「Webサイトが応答する」かどうかをチェックしていません。すべてのDNS要求は、単一のネームサーバーであるLDNSリゾルバーに送信されます。それらすべてが解決した場合でも、 Webサイトのステータスについては何も表示されません。また、あなたが実際にこれらのWebサイトと話しているわけではないので、彼らはあなたがボットであることを知る方法がありません。HTTPリクエストを行った場合にのみ、(HTTPユーザーエージェントヘッダーに基づいて)これを検出できます。
  2. コードの問題に関しては、socket.gethostbyname()を実行する前に、改行文字をトリミングする必要があります。socket.gethostbyname(hostname)と交換socket.gethostbyname(hostname.rstrip())すれば大丈夫です。
于 2012-07-24T21:00:31.397 に答える