我正在尝试随机抽取网页样本,我不想因各种原因而废弃谷歌搜索结果。以下是我尝试过的方法;
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
嗯,它不起作用。首先,它的工作太慢了。其次,它给了我不提供网页的地址。无论如何我可以使这个代码更好,或者你会建议另一种方法来解决这个问题吗?
答案 0 :(得分:1)
假设大多数HTTP服务器在具有域名的主机上运行(例如,不仅仅是IP地址),您可以通过执行DNS查找来进一步验证您的随机IP地址,例如:挖掘。
此外,您不应该允许您的算法创建属于私有IP范围的随机IP。
答案 1 :(得分:0)
嗯...
您的代码运行缓慢,因为它阻止执行,直到(a)查找主机(b)您可以建立连接或更糟糕的连接超时,这可能需要一段时间。
您的代码提供了不提供网页的主机名,原因如下:(a)使用端口80来提供网页只是一种惯例。我可以通过我的服务器在端口80上提供任何我想要的东西。 (b)顶级域名可以配置为不提供任何服务。例如。只有子域或某些URL才会产生有效的http响应。 (c)我不知道的其他几个原因。
要解决1.你必须异步。 This会有所帮助。
我认为,2。无法解决。如果可以的话,size estimates of the web会更加可靠。关于更好的策略,对您的问题的评论仍然适用。
此外,可能存在仅为其分配IPv6地址的Web服务器,因此您的样本以另一种方式倾斜。这在今天没有多大实际意义,但现在情况变化很快。