2012-07-05 45 views
0

的HTTP头我想找检查一百万+域的HTTP报头(即,查找200/404/302)批量检查万个域名

在这一点上我不需要身体HTML (尽管我以后可能会这样),所以最好使用HEAD请求而不是GET。据我所知,有些服务器不支持HEAD,为了简单起见,他们愿意为了不可检测而牺牲这些服务器。我试过用PHP编写的一些解决方案(卷曲,多卷曲,几个DIY卷曲并行选项),但它们都不够快。

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

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

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

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

+2

嗯,这看起来不存在可疑的一切.... – 2012-07-05 19:09:20

+3

@RogueCoder当然不是。我相信它有一个完全合法的用途。 – Lusitanian 2012-07-05 19:11:08

+0

这对很多语言的cURL来说都是微不足道的。你遇到什么问题? – Brad 2012-07-05 19:13:35

回答

0

首先,对于那些由于鱼腥而降低了问题的人:这就是谷歌所做的。我非常感谢他们这样做。就我们所知,这位先生或女士正在构建更好的搜索引擎,我们将从现在开始使用8年。

但是正如Rogue Coder所说:我们不应该全部这样不小心做到这一点。

关于这个问题:你不能得到一个域的标题。您可以通过将HTTP请求完成到一个URL来获取标题。

至于解决方案:你可以使用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}