2016-09-26 96 views
0

我一直在努力構建一個能夠生成文件校驗和的網絡爬蟲。我不想爲無限流(Internet廣播,實時視頻提要等)生成校驗和,因爲它會掛起爬蟲並最終導致內存不足。因此,我需要一種方法來過濾掉這些。無限長內容長度的測試

我試着檢查content-length是否設置爲-1,因爲流媒體不報告內容長度,但發現許多其他服務器選擇不報告其文檔上的內容長度,或使用不報告的漸進式下載內容長度。我目前的解決方案是檢查content-typevideo/*還是audio/*content-length是-1,但這有可能會丟棄逐漸下載的不具有無限長度的媒體文件。

有沒有一種簡單的方法來測試流是無限長的,而不是通過檢查它是否超過任意值?這個項目的語言是Java和JSoup,只要它很重要。

+0

不太清楚,但是當有一個流反應 - 你沒有得到的響應結束,而只是向您發送數據,以便可以使用相同的響應對象發送更多流數據。你可以嘗試檢查,如果響應已經結束,在有限長度媒體的情況下應該是真的 – prabodhprakash

+0

@prabodhprakash請原諒我,如果我沒有理解這一點,但如果數據不斷出現(如無限流),我將如何知道它不會結束? – ndm13

回答

1

是否有一種簡單的方法來測試流是無限長的,而不是通過檢查它是否超過任意值?

既沒有簡單的方法也沒有硬性的方法來確定在達到結束之前可以從任意流中讀取多少字節。事實上,即使Web服務器發送指示特定內容長度的響應標頭,也不能保證它不會發送比廣告更多的內容,或者甚至內容是有限的。

即使您使用啓發式方法(如您所描述的),如果內容長於準備適應的範圍,您仍需準備切斷內容。

+0

因此,你的建議是不斷讀取輸入,直到我遇到任意緩衝區,假設它滿足流數據的特徵('transfer-encoding:chunked; content-length:-1')?或者我不應該相信服務器進行任何傳輸並將啓發式技術推出窗口? – ndm13

+1

@ ndm13我看不出爲什麼你不應用啓發式方法來避免下載標記爲無限/太大的資源。你只是不能完全依賴* - 你需要做好準備,以識別和中止任何*資源的轉移,這些資源會變得太長。這應該不是什麼大問題,因爲它可能會讓你的代碼更簡單一些(而不是僅僅對某些資源應用這種處理)。 –

1

如果內容長度不存在響應,你可以承擔其流,如果你看到:

Transfer-Encoding: chunked 

https://en.wikipedia.org/wiki/Chunked_transfer_encoding

+0

謝謝你的頭像;我可以使用它作爲上述啓發式的一部分。然而,分塊編碼並不是無限流所固有的;抓取工具可以輕鬆地進行漸進式下載,使用沒有長度的分塊編碼(尤其適用於「虛擬URL」)。 – ndm13