1. 程式人生 > >突破某雲盤的限速,利用python實現加速下載!

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

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

xx雲盤限速分析

 

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


                學習Python中有不明白推薦加入交流群
                號:960410445
                群裡有志同道合的小夥伴,互幫互助,
                群裡有不錯的視訊學習教程和PDF!!

  • 限制下載資源的頻寬
  • 限制下載資源時的執行緒或者程序數目

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

2. 多執行緒下載的具體思路如下:

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

xx雲盤多執行緒加速下載,具體實現如下


1. 獲取待下載檔案的 size

以下載 python 2.7 為例,下載連結:點我下載,點選該連結時,應該會直接彈出下載視窗。通常,檔案大小,檔名等資訊都在請求 headers 裡,python 可用如下程式碼獲取該檔案 headers:

 

 

2. 將下載檔案分為 n 個小塊

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

 

 

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

3. python下載檔案的指定區間

這裡先提供一個 python 下載檔案的簡單程式碼作為參考,畢竟越簡單,越容易理解:

 

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

 

上面幾行程式碼下載的檔案即為原檔案的 20-40 位元組段。

4. python 將內容寫到檔案指定位置處

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

 

5. python 多執行緒高速下載

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

 

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

 

列印結果如下:

 

可見,該程式很快的將檔案下載了,速度達到 9M/s 以上。檔案也可以正常開啟,如下圖:

 

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

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

 

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

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

 

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

 

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

 

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

寫在最後

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