如何从网上随机抽取样本?

2024-04-23 08:08:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试随机获取互联网页面的样本,我不想因为各种原因放弃谷歌搜索结果。以下是我尝试的方法

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

嗯,这不管用。首先,它工作太慢了。第二,它给了我不提供网页服务的地址。不管怎样,我能把代码做得更好吗,或者你能建议另一种方法来解决这个问题吗?在


Tags: 方法nameimportiptruereturndefsocket
2条回答

嗯。。。在

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

  2. 您的代码给出的主机名不提供web页面服务有几个可能的原因:(a)使用端口80来服务web页面仅仅是一种约定。我可以从我的服务器在端口80上提供我想要的任何东西。(b) 顶级域可以配置为不提供任何服务。E、 g.只有子域或某些url才会产生有效的http响应。(c) 我不知道还有几个原因。

解1。你必须去异步。This会有帮助的。在

我想,2。无法解决。如果可以,size estimates of the web将更加可靠。在

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

此外,可能有一些web服务器只分配了IPv6地址,因此您的示例以另一种方式倾斜。这在今天没有太大的实际意义,但现在情况变化很快。在

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

另外,您不应该允许您的算法创建一个随机的IP,它是私有IP范围的一部分。在

相关问题 更多 >