如何从互联网上随机抽样?

时间:2013-02-06 18:03:14

标签: python random-sample

我正在尝试随机抽取网页样本,我不想因各种原因而废弃谷歌搜索结果。以下是我尝试过的方法;

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

嗯,它不起作用。首先,它的工作太慢了。其次,它给了我不提供网页的地址。无论如何我可以使这个代码更好,或者你会建议另一种方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

假设大多数HTTP服务器在具有域名的主机上运行(例如,不仅仅是IP地址),您可以通过执行DNS查找来进一步验证您的随机IP地址,例如:挖掘。

此外,您不应该允许您的算法创建属于私有IP范围的随机IP。

答案 1 :(得分:0)

嗯...

  1. 您的代码运行缓慢,因为它阻止执行,直到(a)查找主机(b)您可以建立连接或更糟糕的连接超时,这可能需要一段时间。

  2. 您的代码提供了不提供网页的主机名,原因如下:(a)使用端口80来提供网页只是一种惯例。我可以通过我的服务器在端口80上提供任何我想要的东西。 (b)顶级域名可以配置为不提供任何服务。例如。只有子域或某些URL才会产生有效的http响应。 (c)我不知道的其他几个原因。

  3. 要解决1.你必须异步。 This会有所帮助。

    我认为,2。无法解决。如果可以的话,size estimates of the web会更加可靠。

    关于更好的策略,对您的问题的评论仍然适用。

    此外,可能存在仅为其分配IPv6地址的Web服务器,因此您的样本以另一种方式倾斜。这在今天没有多大实际意义,但现在情况变化很快。