0

100 万以上のドメインの HTTP ヘッダーをチェックしようとしています (つまり、200/404/302 を探します)。

この時点では、本文の HTML は必要ありません (後で必要になるかもしれませんが) ので、GET ではなく HEAD リクエストを使用することをお勧めします。一部のサーバーは HEAD をサポートしていないことを理解しており、物事をシンプルに保つために、HEAD をチェック不能として喜んで犠牲にします。

PHP で記述された多くのソリューション (カール、マルチ カール、いくつかの DIY カール並列オプション) を試しましたが、どれも十分に高速ではありません。

どの言語を使用しても問題ありません。理想的な結果は、既にコンパイルされていて、単に URL のリストを取得してヘッダーを吐き出す C アプリを見つけることです。たとえば、私はすべてのドメインの DNS 設定をチェックするために事前にロールされた DNS アプリケーションを使用しています。私がしなければならないことは、それにパイプを開いてドメインをフィードすることだけであり、応答が入って​​くると応答を吐き出します (必ずしも同じ順番)。

十分に高速にするには、非同期またはスレッド化する必要があります。

いくつかの python オプション (Twisted フレームワークや liburl2 など) を調べましたが、信頼できるものを起動して実行することはできませんでした。

誰かが私に既製の解決策を教えてくれることを願っています!

4

2 に答える 2

4

gevent、特にそれに基づくライブラリを見てください。例: https://github.com/gwik/geventhttpclient

于 2012-07-05T19:13:22.173 に答える
0

まず、怪しさのために質問に反対票を投じた人のために: これは Google が行うことです。彼らがそうしてくれてとても感謝しています。私たちが知っている限りでは、この紳士または女性は、今から 8 年後に私たちが使用するより優れた検索エンジンを構築しています。

しかし、Rogue Coder が言うように、私たち全員がこれを不注意に行うべきではありません。

質問について: ドメインのヘッダーを取得できません。URL への HTTP 要求を完了すると、ヘッダーが取得されます。

解決策については、組み込みの httplib など、利用可能な多くの http ライブラリのいずれかで python を使用できます。リクエストの量が多いため、スレッドを使用して多数のリクエストを並行して作成する必要があります。以下の例は単純すぎます。実際には、スレッドプールを使用します。また、多数の同時接続があると、それ自体の問題が生じます。だから:あなたはそれをどれくらい速くしたいですか?

import httplib
from threading import Thread
import time

hosts = [ 'www.google.com', 'www.yahoo.com', 'nos.nl' ]
responses = {}

class StatusChecker(Thread):

    def __init__(self, hostname):
        Thread.__init__(self)
        self.hostname = hostname

    def run(self):
        conn = httplib.HTTPConnection(self.hostname)
        conn.request("HEAD", "/index.html")
        res = conn.getresponse()
        responses[self.hostname] = res.status



if __name__ == "__main__":
    for h in hosts:
        StatusChecker(h).start()

    time.sleep(10)
    print responses

これは次のようになります。

$ python test.py
{'nos.nl': 200, 'www.yahoo.com': 301, 'www.google.com': 200}
于 2012-07-05T22:30:50.373 に答える