2013-02-06 33 views
5

我想獲得隨機樣本的互聯網網頁,我不想因各種原因報廢谷歌搜索結果。以下是我已經嘗試過的方法;如何從互聯網上隨機抽取樣本?

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 

嗯,它不工作。首先,它工作得太慢了。其次,它給了我不會提供網頁的addreses。無論如何,我可以使這個代碼更好,或者你會建議另一種方法來解決這個問題?

+5

現代Web服務器(HTTP 1.1)*需要一個主機名,因爲它們將爲同一IP地址上的許多不同的站點提供服務。你的方法是行不通的。 –

+1

你能詳細說明你想要的樣品的原因嗎?它可能有助於縮小問題範圍(例如,比網絡的初始人口更窄)。 –

+4

此外,通過在全球範圍內隨機分配IP地址,您更有可能會遇到不需要託管網站的機器。 –

回答

0

嗯......

  1. 你的代碼工作緩慢,因爲它會阻止執行,直到(一)主機擡頭(b)您可以建立一個連接或更糟的連接超時,這可能需要一會兒。

  2. 由於幾種可能的原因,您的代碼提供了不提供網頁的主機名:(a)使用端口80來提供網頁僅僅是一種約定。我可以從服務器上爲端口80提供任何我想要的功能。 (b)頂級域名可以配置爲不提供任何服務。例如。只有子域或某些URL纔會生成有效的http響應。 (c)我不知道的其他幾個原因。

要解決1.你必須去異步。 This會有所幫助。

我想,2.無法解決。如果可以的話,size estimates of the web會更可靠。

關於更好的策略,對您的問題的評論仍然適用。

此外,可能有僅分配了IPv6地址的Web服務器,因此您的示例以另一種方式傾斜。這與今天沒有多大關係,但現在事情變化很快。

1

假設大多數HTTP服務器在具有域名(例如,不僅是IP地址)的主機上運行,​​您可以通過執行DNS查找來進一步驗證您的隨機IP地址。挖。

此外,您不應該允許您的算法創建屬於私有IP範圍的隨機IP。