2009-09-04 29 views
2

我在寫一個多線程的Java Web爬蟲。根據我對網絡的理解,當用戶加載網頁時,瀏覽器請求第一個文檔(例如index.html),並且當它接收到HTML時,它將查找需要包含的其他資源(圖像,CSS,JS )並同時要求這些資源。我應該可以同時打開多少個Java HttpURLConnections?

我的搜尋器只請求原始文檔。出於某種原因,我無法每5秒鐘刮掉2到5頁。我爲每個HttpURLConnection創建一個新線程。我似乎應該至少能夠每秒鐘掃描20-40頁。如果我嘗試啓動100個線程,那麼I/O異常就像瘋了一樣。任何想法發生了什麼?

+1

考慮到許多服務器限制同一IP訪問的限制。對於爬蟲至少在請求之間等待半秒或一秒鐘,這是標準做法。另請查看archive.org的抓取工具Heritrix。它是開源的,用Java編寫。很好。 – 2009-09-04 22:37:56

回答

1

這是一個好主意,看看你的代碼,因爲你可能做了一些稍微錯誤的事情,並且打破了你的抓取程序,但是按照一般的經驗法則,異步IO遠遠優於HttpURLConnection提供的阻塞IO。異步IO允許您處理單個線程中的所有處理,並且所有實際的IO都由操作系統在其自己的時間完成。

爲了很好地實現通過異步IO的HTTP協議,請看Apache's HTTP core。看到這樣一個客戶的例子here

0

有關您正在接收的IOException異常的詳細信息可能非常方便。有幾種可能性需要考慮。

  • 打開文件描述符限制(太多的套接字)。
  • 由於打開到給定服務器的太多連接而拒絕連接。
  • 在能夠處理任何數據之前獲取太多數據(假設它阻止了IO - 如果您向100個不同的服務器發出100個請求,您將突然收到大量數據 - HTTP GET請求是小 - 響應可能不是你能有效的DDOS自己)
  • 你在你的代碼:)
0

了一個愚蠢的錯誤線程的最佳數量或HttpUrlConnections取決於許多因素。

  • 如果您抓取外部網站,而您並非所有者,則應僅使用一個線程和延遲。在另一種情況下,該網站可以檢測到DOS攻擊。在這個時候抓取不同的網站是有意義的。
  • 如果它是你自己的網站沒有DOS檢測,那麼它取決於網絡延遲。 Web服務器在您的LAN中,那麼使用您使用的CPU核心的雙重計數會很有幫助。如果Web服務器在Internet中,那麼使用更多的線程會很有幫助。但我的100個線程都很大。這可能會摧毀你的網絡服務器。網絡服務器有多少員工?
0

哦,我希望你已經接近你從輸入中獲得的輸入流。無論如何,它們都會在Connection的終結器中關閉,但這可能很快就會過去。我自己遇到了這個問題,所以也許這對你有幫助。

相關問題