2012-07-05 38 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}