0

我正在寻找一百万多个域的 HTTP 标头(即查找 200/404/302)

在这一点上,我不需要正文 HTML(尽管稍后我可能会),所以最好使用 HEAD 请求而不是 GET。我知道有些服务器不支持 HEAD 并且愿意为了保持简单而牺牲那些无法检查的服务器。

我已经尝试了许多用 PHP 编写的解决方案(curl、multi curl、几个 DIY curl 并行选项),但它们都不够快。

我很乐意使用任何语言,理想的结果是找到一个已经编译的 C 应用程序,只需获取一个 url 列表并吐出标题。例如,我使用一个预滚动的 DNS 应用程序来检查所有这些域的 DNS 设置,我所要做的就是打开一个管道并将其提供给它的域,它会在它们进入时将答案吐回(不一定在相同的顺序)。

它需要异步或线程化才能足够快。

我探索了一些 python 选项(如 Twisted 框架和 liburl2),但无法获得任何可靠的启动和运行。

希望有人能帮我指出一个现成的解决方案!

4

2 回答 2

4

看看gevent,尤其是基于它的库。例如:https ://github.com/gwik/geventhttpclient

于 2012-07-05T19:13:22.173 回答
0

首先,对于那些因为可疑而拒绝投票的人:这就是谷歌所做的。我非常感谢他们这样做。据我们所知,这位先生或女士正在构建更好的搜索引擎,我们将在 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}
于 2012-07-05T22:30:50.373 回答