2014-01-10 67 views
4

我使用httplib從一個網站抓取一堆資源,我希望它以最低的成本,所以我設置'連接:保持活動'HTTP頭對我的請求,但我不知道它實際上使用相同的TCP連接儘可能多的請求作爲網絡服務器允許的。確實httplib重用TCP連接?

i = 0 
    while 1: 
     i += 1 
     print i 
     con = httplib.HTTPConnection("myweb.com") 
     con.request("GET", "/x.css", headers={"Connection":" keep-alive"}) 
     result = con.getresponse() 
     print result.reason, result.getheaders() 

我的實施是否正確? 保持活力嗎? 我應該把'con = httplib.HTTPConnection(「myweb.com」)'放在循環之外嗎?

P.S:Web服務器的保持活動響應是好的, 我知道urllib3

+2

@CrazyCasta:你爲什麼認爲它是重複的? 'urllib2'使用'Connection:close',即一個請求 - 一個連接。 'httplib'使用'HTTP/1.1',即默認情況下可以重新使用連接。相關:[持久性urllib.request連接到HTTP服務器](http://stackoverflow.com/q/9772854/4279) – jfs

+0

如果你看看這個問題,它是關於如何在python中執行多個HTTP請求。 urllib2有點誤導。如果你看第一個答案,它特別涉及到httplib。 – CrazyCasta

回答

8

您的示例每次都通過循環創建一個新的TCP連接,因此不會重用該連接。

這個怎麼樣?

con = httplib.HTTPConnection("myweb.com") 
while True: 
    con.request("GET", "/x.css", headers={"Connection":" keep-alive"}) 
    result = con.getresponse() 
    result.read() 
    print result.reason, result.getheaders() 

此外,如果您只需要標頭,則可以使用HTTP HEAD方法,而不是調用GET並丟棄內容。

0

如果通過循環&hellip每次報廢HTTPConnection對象那肯定不能重用的連接;

+0

我把httpconnection創建在循環內部,以避免每次我調用request/getresponse時讀取數據。當我把它放在循環之外時,我監視程序(通過wireshark),我不確定程序是如何工作的? – sia