2013-02-06 5 views
5

Ich versuche, zufällige Stichprobe von Internet-Seiten zu bekommen, ich möchte Google Suchergebnisse aus verschiedenen Gründen nicht verschrotten. Hier ist, wie ich es versucht habe;Wie man eine Stichprobe aus dem Internet macht?

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 

Nun, es funktioniert nicht. Erstens, es funktioniert zu langsam. Zweitens gibt es mir Adressen, die keine Webseiten bedienen. Kann ich diesen Code trotzdem besser machen, oder würden Sie einen anderen Weg vorschlagen, dieses Problem zu lösen?

+5

Moderne Webserver (HTTP 1.1) * benötigen * einen Hostnamen, da sie * viele * verschiedene Seiten unter der gleichen IP-Adresse bedienen. Dein Ansatz wird nicht funktionieren. –

+1

Können Sie die Gründe für die Probe näher erläutern? Es kann helfen, die Problemdomäne ein wenig einzugrenzen (zum Beispiel auf eine engere Anfangspopulation als das Internet). –

+4

Wenn Sie an zufälligen IP-Adressen auf der ganzen Welt herumstöbern, stoßen Sie eher auf Computer, die keine Websites hosten als auf Maschinen, die dies tun. –

Antwort

0

Well ...

  1. Ihr Code arbeitet langsam, weil es blockiert die Ausführung bis (a) die Host (b) nachgeschlagen Sie aus einer Verbindung oder schlechter Ihre Umsteigezeiten etablieren könnten, was nehmen könnte eine Weile.

  2. Ihr Code gibt Hostnamen an, die Webseiten aus mehreren möglichen Gründen nicht unterstützen: (a) Die Verwendung von Port 80 zur Bereitstellung von Webseiten ist lediglich eine Konvention. Ich könnte alles, was ich an Port 80 von meinem Server wünschen würde dienen. (b) Die Top-Level-Domain könnte so konfiguriert sein, dass sie nichts liefert. Z.B. Nur Subdomains oder bestimmte URLs ergeben eine gültige HTTP-Antwort. (c) mehrere andere Gründe, die mir nicht bekannt sind.

Um zu lösen 1. müssen Sie asynchron gehen. This wird helfen.

Ich denke, 2. kann nicht gelöst werden. Wenn es könnte, wäre size estimates of the web viel zuverlässiger.

In Bezug auf bessere Strategien gelten die Kommentare zu Ihrer Frage immer noch.

Darüber hinaus könnte es Web-Server geben, denen nur IPv6-Adressen zugewiesen sind, so dass Ihre Probe auf andere Weise verzerrt ist. Das ist heute nicht von großer praktischer Bedeutung, aber die Dinge ändern sich heutzutage schnell.

1

Unter der Annahme, dass die meisten HTTP-Server auf einem Host mit Domänennamen (z. B. nicht nur einer IP-Adresse) ausgeführt werden, können Sie Ihre zufälligen IP-Adressen durch eine DNS-Suche, z. graben.

Außerdem sollten Sie nicht zulassen, dass Ihr Algorithmus eine zufällige IP erstellt, die Teil der privaten IP-Bereiche ist.