突破某雲盤的限速,利用python實現加速下載!

計劃做這樣的多線程下載是因為xx雲盤限速厲害,到了噁心的地步,我想試試用多線程下載xx雲盤的資源是否能夠實現加速。

xx雲盤限速分析

突破某雲盤的限速,利用python實現加速下載!

1. 關於限速,我揣測有兩種情況:

當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?

所以小編準備了一份零基礎入門到大牛的Python的視頻學習資料。私信小編“007”即可領取!

  • 限制下載資源的帶寬
  • 限制下載資源時的線程或者進程數目

如果限速是第一種,多線程下載也無法提速。但如果是第二種限速,多線程下載理應能夠顯著提升下載速度,在一定範圍內,提速的程度與下載的線程數目成正相關關係。即,下載的線程越多,下載總速度越快。

2. 多線程下載的具體思路如下:

  • 獲取待下載文件的大小 size
  • 將待下載文件分成 n 塊,第 i 塊大小為 subi ,n 個 subi 之和等於 size
  • 在下載進程中開啟 n 個線程,每個線程負責下載一個 sub
  • 所有線程下載的資源按照原有順序寫入文件,完成後,該文件即為下載後的文件

xx雲盤多線程加速下載,具體實現如下


1. 獲取待下載文件的 size

以下載 python 2.7 為例,下載鏈接:點我下載,點擊該鏈接時,應該會直接彈出下載窗口。通常,文件大小,文件名等信息都在請求 headers 裡,python 可用如下代碼獲取該文件 headers:

突破某雲盤的限速,利用python實現加速下載!

突破某雲盤的限速,利用python實現加速下載!

2. 將下載文件分為 n 個小塊

這一步其實就是簡單的數學題了,下面直接上代碼,以 n=5 等分為例,如下:

突破某雲盤的限速,利用python實現加速下載!

突破某雲盤的限速,利用python實現加速下載!

可見,文件被 5 等分了,因為 size 不能被 5 整除,所以最後一段比之前 4 段都長一些。

3. python下載文件的指定區間

這裡先提供一個 python 下載文件的簡單代碼作為參考,畢竟越簡單,越容易理解:

突破某雲盤的限速,利用python實現加速下載!

假設文件大小為 100 個字節,上面這幾行代碼是下載整個文件的,那麼,怎樣才能夠下載指定區間的文件呢?比如我想下載 20-40 字節段的文件,怎麼實現呢?方法如下,還是直接上代碼:

突破某雲盤的限速,利用python實現加速下載!

上面幾行代碼下載的文件即為原文件的 20-40 字節段。

4. python 將內容寫到文件指定位置處

第 3 節中提供的代碼,實際上是將下載的 20-40 字節段寫到 filename 的 0-20 位置了。這樣一來,雖然內容被下載了,但是卻沒有放在文件正確的位置處,最終即使所有字節都下載了,文件也是無法打開的。那麼,如何將 20-40 字節段內容寫到 filename 的 20-40 位置呢?其實只需要添加一行 seek 代碼,指定一下寫文件的起始位置即可,如下:

突破某雲盤的限速,利用python實現加速下載!

5. python 多線程高速下載

在第 3、4 節基礎上,寫下如下函數:

突破某雲盤的限速,利用python實現加速下載!

該函數將從 url 下載 spos-fpos 段的內容,寫到 fp 的指定位置處。結合第 1、2 節,開 n 個線程下載 python 2.7,具體代碼如下,直接採用了 threading 庫:

突破某雲盤的限速,利用python實現加速下載!

打印結果如下:

突破某雲盤的限速,利用python實現加速下載!

可見,該程序很快的將文件下載了,速度達到 9M/s 以上。文件也可以正常打開,如下圖:

突破某雲盤的限速,利用python實現加速下載!

6. 測試下載被限速的xx雲盤,觀察是否提速成功

第 5 節提供的下載 python 2.7 文件沒有被限速,不能體現本貼程序的提速性能。接下來,測試下載被噁心限速的 xx 雲盤的文件,採用的下載鏈接可以自行從自己的雲盤裡提取:

突破某雲盤的限速,利用python實現加速下載!

我的url是 https://nj01ct01.baidupcs.com/file/…

直接採用瀏覽器下載時,速度最快達到 18KB/s,且經常出現速度為 0 的情況,下載 3m 多點的文件用了 好幾分鐘,如下圖:

突破某雲盤的限速,利用python實現加速下載!

採用本帖下載時,輸出如下,用時 65 秒,速度 51 KB/s:

突破某雲盤的限速,利用python實現加速下載!

速度提升了 5 倍,我們增加線程數,即增大加速倍數,再試。將線程數目增加到 30,即 令 n=30 時,同樣下載該鏈接,輸出如下,用時 12s, 速度 279 KB/s,速度提升了 30 倍:

突破某雲盤的限速,利用python實現加速下載!

可見,採用本帖提供的 python 多線程下載xx網盤,的確可以顯著提升下載速度。

寫在最後

當然,這裡只是提供了一種加速下載的方案,代碼都是demo級的,可能會有bug,有機會的話,我會把它完善成一個下載工具。

突破某雲盤的限速,利用python實現加速下載!


分享到:


相關文章: