2013-02-06 14 views
5

Próbuję uzyskać losową próbkę stron internetowych, nie chcę wyrzucać wyników wyszukiwania google z różnych powodów. Oto, jak tego próbowałem;Jak zrobić losową próbkę z Internetu?

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 

Cóż, to nie działa. Po pierwsze, działa zbyt wolno. Po drugie, daje mi adresy, które nie obsługują stron internetowych. Czy mimo to mogę poprawić ten kod, czy może zaproponowałbyś inny sposób rozwiązania tego problemu?

+5

Nowoczesne serwery WWW (HTTP 1.1) * wymagają * nazwy hosta, ponieważ będą wyświetlać * wiele * różnych witryn na tym samym adresie IP. Twoje podejście nie zadziała. –

+1

Czy możesz wyjaśnić powody, dla których chcesz pobrać próbkę? Może pomóc nieco zawęzić obszar problemowy (na przykład węższą populację początkową niż Internet). –

+4

Ponadto, wyszukując losowo adresy IP na całym świecie, istnieje większe prawdopodobieństwo, że napotkasz maszyny, które * nie * hostują stron internetowych niż te, które je obsługują. –

Odpowiedz

0

Cóż ...

  1. Twój kod działa powoli, ponieważ blokuje wykonanie aż (a) host spojrzał w górę (b) można nawiązać połączenie lub gorzej swoje czasy połączeń na zewnątrz, które mogłyby wziąć chwila.

  2. Twój kod podaje nazwy hostów, które nie obsługują stron internetowych z kilku możliwych przyczyn: (a) Używanie portu 80 do obsługi stron internetowych to tylko konwencja. Mogę podać wszystko, czego pragnę na porcie 80 z mojego serwera. (b) Domena najwyższego poziomu może być skonfigurowana tak, aby niczego nie obsługiwać. Na przykład. tylko poddomeny lub określone adresy URL dają poprawną odpowiedź http. (c) kilka innych powodów, których nie jestem świadomy.

Aby rozwiązać 1. musisz przejść asynchronicznie. This pomoże.

Myślę, że 2. nie da się rozwiązać. Gdyby mógł, size estimates of the web byłby o wiele bardziej niezawodny.

Jeśli chodzi o lepsze strategie, nadal mają zastosowanie komentarze do pytania.

Ponadto mogą istnieć serwery internetowe z przypisanymi tylko adresami IPv6, więc Twoja próbka jest przekrzywiona w jeszcze inny sposób. Dziś nie ma to większego znaczenia praktycznego, ale w dzisiejszych czasach sytuacja się zmienia.

1

Przyjmując założenie, że większość serwerów HTTP działa na hoście z nazwą domeny (np. Nie tylko adresem IP), można dodatkowo zweryfikować losowe adresy IP, wykonując wyszukiwanie DNS, np. kopać.

Nie należy również zezwalać algorytmowi na tworzenie losowego adresu IP, który należy do prywatnych zakresów adresów IP.

Powiązane problemy