批量检查一百万个域的 HTTP 标头


Bulk check the HTTP headers of a million domains

我想检查一百万个+域的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}