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

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

4

2 回答 2

1

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

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

于 2013-02-12T04:38:58.493 回答
0

出色地...

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

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

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

我认为,2.无法解决。如果可以的话,网络的大小估计会更加可靠。

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

此外,可能存在仅分配给它们的 IPv6 地址的 Web 服务器,因此您的示例以另一种方式倾斜。这在今天没有太大的实际意义,但现在情况正在迅速变化。

于 2013-02-07T15:22:05.267 回答