2011-12-20 69 views
3

我在python寫了一個爬蟲基於某些給定URL的網站上下載一些網頁。我注意到偶爾我的程序掛在這行「conn.getresponse()」。沒有例外被拋出,程序只是在那裏永遠等待。避免掛在conn.getresponse()(httplib.HTTPConnection)

conn = httplib.HTTPConnection(component.netloc) 
conn.request("GET", component.path + "?" + component.query) 
resp = conn.getresponse() #hang here 

我讀的API文檔和它說,(以添加超時):

conn = httplib.HTTPConnection(component.netloc, timeout=10) 

然而,這並不讓我的「重試」的連接。超時後重試抓取的最佳做法是什麼?

例如,我想以下解決方案:

trials = 3 
while trials > 0: 
    try: 
     ... code here ... 
    except: 
     trials -= 1 

上午我在正確的方向?

+0

有時碰巧的是,Python庫解釋一些頭不同於Web瀏覽器(如發生在[這個問題](http://stackoverflow.com/q/8527862/183066))。因此,爲了確保,我認爲你可以嘗試在網絡瀏覽器中打開相同的URL。 – jcollado 2011-12-20 06:55:44

回答

1

然而,這並不讓我的「重試」的連接。

是,超時旨在推動這一政策回到原來的位置,在你的代碼(進出httplib)。

在超時後重試抓取的最佳做法是什麼?

這是非常依賴於應用程序。您的爬行器可以延遲其他工作多長時間?你希望它深入到每個站點深處?你需要能夠忍受緩慢的超額訂閱服務器嗎?遇到搜尋器時有節流或其他對策的服務器如何?當我問,你是否尊重robots.txt

由於這些問題的答案可能千差萬別,這是有道理的,你要調整這對您的履帶式的需求,你會在網站抓取(假設有趨勢),以及您的廣域網性能。