我想检查一百万个+域的HTTP标头(即查找200/404/302)
在这一点上,我不需要正文 HTML(尽管我以后可能),所以最好使用 HEAD 请求而不是 GET。我知道有些服务器不支持 HEAD,并且为了保持简单而愿意牺牲那些无法检查的服务器。
我已经尝试了许多用PHP编写的解决方案(curl,multi curl,几个DIY curl并行选项),但没有一个足够快。
我很高兴使用任何语言,理想的结果是找到一个已经编译的 C 应用程序,只需获取 url 列表并吐出标题。例如,我使用预卷的DNS应用程序来检查所有这些域的DNS设置,我所要做的就是打开一条管道并向其提供域,它会在答案进入时吐回答案(不一定以相同的顺序)。
它需要异步或线程才能足够快。
我探索了一些python选项(如Twisted框架和liburl2),但无法启动和运行任何可靠的东西。
希望有人能帮我指出一个现成的解决方案!
看看 gevent,尤其是基于它的库。例如:https://github.com/gwik/geventhttpclient
首先,对于那些因为可疑而对这个问题投反对票的人:这就是谷歌所做的。我非常感谢他们这样做。据我们所知,这位绅士或女士正在构建更好的搜索引擎,我们将在8年后使用。
但正如Rogue Coder所说:我们不应该都粗心大意地这样做。
关于问题:您无法获取域的标头。您可以通过完成对 URL 的 HTTP 请求来获取标头。
至于解决方案:您可以将python与许多可用的http库之一一起使用,例如内置的httplib。由于请求量大,您需要使用线程来并行发出多个请求。下面的例子太简单了。在现实生活中,您将使用线程池。此外,同时进行许多连接会带来自己的问题。所以:你想要它有多快?
import httplib
from threading import Thread
import time
hosts = [ 'www.google.com', 'www.yahoo.com', 'nos.nl' ]
responses = {}
class StatusChecker(Thread):
def __init__(self, hostname):
Thread.__init__(self)
self.hostname = hostname
def run(self):
conn = httplib.HTTPConnection(self.hostname)
conn.request("HEAD", "/index.html")
res = conn.getresponse()
responses[self.hostname] = res.status
if __name__ == "__main__":
for h in hosts:
StatusChecker(h).start()
time.sleep(10)
print responses
这将给出类似的东西:
$ python test.py
{'nos.nl': 200, 'www.yahoo.com': 301, 'www.google.com': 200}