2011-02-12 77 views
5

我有一個大型的抓取工作要做 - 由於大量的網絡延遲,大部分腳本的時間都被阻塞了。我想多線程的腳本,這樣我就可以同時進行多個請求,但我的線程的10%左右,出現以下錯誤python中的多線程web請求 - '名稱或服務未知'

URLError: <urlopen error [Errno -2] Name or service not known> 

剩下的90%成功完成死亡。我正在請求來自同一個域的多個頁面,所以它似乎可能會出現一些DNS問題。我一次提出25個請求(25個線程)。如果我一次只限制5個請求,一切正常,但一旦我接近10個請求,我有時會看到這個錯誤。

我已閱讀Repeated host lookups failing in urllib2 其中描述了我有同樣的問題,並遵循其中的建議,但無濟於事。

我也嘗試使用多處理模塊而不是多線程,我得到了相同的行爲 - 大約10%的進程死於相同的錯誤 - 這導致我相信這不是urllib2的問題但別的東西。

有人可以解釋發生了什麼,並建議如何解決?

UPDATE

如果我手工編碼的網站的IP地址到我的劇本一切完美,所以DNS查找在這個錯誤發生的某個時候。

+0

您有權訪問服務器嗎?你可能會遇到一些反拒絕服務的東西,或者如果服務器不是那麼重的話,那麼你實際上可能會超載它... – jswolf19

+0

這是一個主要的網站,能夠處理數百或數以千計的同時請求,我25甚至沒有一個小小的凹痕。我很確定這是一個DNS解決的問題,因爲如果我用IP地址替換域名,我的腳本運行完美 - 所以網站沒有明確地關閉我。在這一點上,我只想了解DNS查找失敗的原因。 –

+0

然後,DNS服務器可能會出現一個問題,只允許客戶在一段時間內發出如此多的請求,或者您有什麼要求。 – jswolf19

回答

1

建議:嘗試啓用系統中的DNS緩存,如nscd。如果你的scraper總是向同一個域發出請求,這應該消除DNS查找問題。

請確保由urllib2.urlopen返回的文件對象在讀取後正確關閉,以釋放資源。否則,您可能會達到系統中最大打開套接字的限制。

另外,考慮到politeness policy網絡爬蟲應該不得不避免超負荷多個請求的服務器。

+1

我已經完成了這兩件事,我在帖子中鏈接到的另一個堆棧溢出問題提出了這兩個建議,但它不能解決我的問題。直接使用IP地址而不是域名,但我不明白爲什麼nscd不能解決這個問題,因爲它似乎與DNS緩存有關。 –

相關問題