2013-02-06 24 views
5

Sto cercando di ottenere un campione casuale di pagine internet, non voglio scartare i risultati di ricerca di Google per vari motivi. Ecco come l'ho provato a fare;Come creare un campione casuale da Internet?

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 

Bene, non funziona. Innanzitutto, funziona troppo lentamente. In secondo luogo, mi dà addres che non servono pagine web. Esiste comunque la possibilità di migliorare questo codice o suggerire un altro modo per risolvere questo problema?

+5

moderni server web (HTTP 1.1) * * bisogno di un nome host, in quanto serviranno * * molti siti diversi sullo stesso indirizzo IP. Il tuo approccio non funzionerà. –

+1

Puoi approfondire i motivi per cui desideri il campione? Potrebbe aiutare a restringere un po 'il dominio del problema (ad esempio a una popolazione iniziale più ristretta rispetto a Internet). –

+4

Inoltre, colpendo gli indirizzi IP casuali in tutto il mondo, è più probabile che incappiate in macchine che * non * ospitano siti Web rispetto alle macchine che lo fanno. –

risposta

0

Beh ...

  1. Il tuo codice funziona lento perché blocca l'esecuzione fino a quando (a) l'ospite viene cercato (b) si può stabilire una connessione o peggiorare i timeout della connessione, che potrebbe richiedere un po.

  2. Il tuo codice dà nomi host che non servono pagine web per diversi possibili motivi: (a) Usare la porta 80 per servire le pagine web è solo una convenzione. Potrei servire qualsiasi cosa desiderassi sulla porta 80 dal mio server. (b) Il dominio di primo livello potrebbe essere configurato per non servire nulla. Per esempio. solo i sottodomini o determinati URL producono una risposta http valida. (c) molte altre ragioni di cui non sono a conoscenza.

Per risolvere 1. devi andare asincrono. This aiuterà.

Penso, 2. non può essere risolto. Se potesse, size estimates of the web sarebbe molto più affidabile.

Per quanto riguarda le strategie migliori, si applicano ancora i commenti alla tua domanda.

Inoltre, ci potrebbero essere i server web che hanno solo gli indirizzi IPv6 assegnati loro, in modo che il campione è distorta in un altro modo. Questo non ha molta rilevanza pratica oggi, ma le cose cambiano rapidamente al giorno d'oggi.

1

facendo l'ipotesi che la maggior parte dei server HTTP viene eseguito su un host con nome di dominio (ad esempio, non solo un indirizzo IP), si può ulteriormente verificare gli indirizzi IP casuali effettuando una ricerca DNS, per esempio scavare.

Inoltre, non si dovrebbe consentire l'algoritmo per creare una IP casuale che fa parte delle gamme IP privati.