5

インターネット ページのランダム サンプルを取得しようとしていますが、さまざまな理由で Google 検索結果を破棄したくありません。これが私が試した方法です。

import socket
from random import randint

def doesitserveawebpage(ip):
    ip=str(ip)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((ip, 80))
        s.shutdown(2)
        return True
    except:
        return False

def givemerandomwebsite():
    adrformat = "%d.%d.%d.%d"
    while True:
        adr = adrformat % tuple(randint(0,255) for _ in range(4))
        try:
            print "Tring %s" % adr
            name = socket.gethostbyaddr(adr)
            if (doesitserveawebpage(adr)):
                return name
            else:
                continue
        except socket.herror:
            continue

まあ、うまくいきません。まず、動作が遅すぎる。次に、Web ページを提供しないアドレスが表示されます。このコードを改善できる方法はありますか、それともこの問題を解決する別の方法を提案していただけますか?

4

2 に答える 2

1

ほとんどの HTTP サーバーがドメイン名 (IP アドレスだけでなく) を持つホストで実行されていると仮定すると、dig などの DNS ルックアップを実行して、ランダムな IP アドレスをさらに確認できます。

また、アルゴリズムがプライベート IP 範囲の一部であるランダムな IP を作成することを許可しないでください。

于 2013-02-12T04:38:58.493 に答える
0

良い...

  1. (a) ホストが検索されるまで (b) 接続が確立されるか、接続がタイムアウトになるまで実行がブロックされるため、コードの動作が遅くなります。これには時間がかかる場合があります。

  2. あなたのコードは、いくつかの考えられる理由で Web ページを提供しないホスト名を与えます: (a) ポート 80 を使用して Web ページを提供することは単なる慣習です。サーバーからポート 80 で必要なものを何でも提供できました。(b) トップレベル ドメインは、何も提供しないように構成できます。たとえば、サブドメインまたは特定の URL のみが有効な http 応答を生成します。(c) 私が知らない他のいくつかの理由。

1.を解決するには、非同期にする必要があります。これは役に立ちます。

2.は解けないと思います。可能であれば、Web のサイズの見積もりはより信頼できるものになります。

より良い戦略に関しては、あなたの質問へのコメントが引き続き適用されます。

さらに、IPv6 アドレスのみが割り当てられている Web サーバーが存在する可能性があるため、サンプルはさらに別の方法で偏っています。これは今日ではあまり実用的ではありませんが、今日では急速に変化しています。

于 2013-02-07T15:22:05.267 に答える