學會這招,再也不怕下載大文件失敗了

學會這招,再也不怕下載大文件失敗了

學會這招,再也不怕下載大文件失敗了

點擊上方“python學習專欄”,選擇“置頂公眾號”

乾貨、福利第一時間送達!


不知道你有沒有遇到過這種情況,下載文件過程十分緩慢,緩慢也就算了。關鍵是馬上要下載好的時候,它竟然失敗了,還不支持繼續下載,


學會這招,再也不怕下載大文件失敗了


今天我們就來解決這個小問題


先貼代碼

<code>

import

sys

import

requests

import

os

def

download

(url, file_path)

:

response = requests.get(url, stream=

True

, verify=

False

) print(response.status_code)

try

: total_size = int(response.headers[

'Content-Length'

]) print(response.headers[

'Content-Length'

])

except

Exception

as

e: print(e) quit()

if

os.path.exists(file_path): temp_size = os.path.getsize(file_path)

else

: temp_size =

0

headers = {

'Range'

:

'bytes=%d-'

% temp_size} res = requests.get(url, stream=

True

, verify=

False

, headers=headers) res.headers

with

open(file_path,

"ab"

)

as

f:

for

chunk

in

res.iter_content(chunk_size=

100

):

if

chunk: temp_size += len(chunk) f.write(chunk) f.flush() done = int(

50

* temp_size / total_size) sys.stdout.write(

"\r[%s%s] %d%%"

% (

'█'

* done,

' '

* (

50

- done),

100

* temp_size / total_size)) sys.stdout.flush() print()

if

__name__ ==

'__main__'

: url =

"https://codeload.github.com/zylo117/Yet-Another-EfficientDet-Pytorch/zip/master"

path =

"G:/123.zip"

download(url, path)/<code>


HTTP中的Range就是分段請求字節數,也是大家經常說的斷點續傳。Range頭域可以請求實體的一個或者多個子範圍,Range的值為0表示第一個字節,也就是Range計算字節數是從0開始的

表示第二個500字節:bytes=500-999

表示最後500個字節:bytes=-500

表示500字節以後的範圍:bytes=500-

第一個和最後一個字節:bytes=0-0,-1

同時指定幾個範圍:bytes=500-600,601-999

從頭開始下載 Range: bytes=0-


這是http文件下載的一種規範,當然也有不支持這種規範的網站,對於不支持的網站一般也是有它規定的參數的,那就需要你自己動手動腦了

比如說,我現在在寫的項目就沒有支持

學會這招,再也不怕下載大文件失敗了


這裡下載的是github的一個目標檢測的項目


效果如下,這裡沒有進行錄屏,大家可以自己嘗試一下

學會這招,再也不怕下載大文件失敗了


我們使用debug模式看一下response headers 都有什麼

學會這招,再也不怕下載大文件失敗了

先看一下本地變量,全部是大小6674159字節,當前已經下載了1877700 字節


學會這招,再也不怕下載大文件失敗了

這個圖是我通過手機拍攝的,有點模糊,但是大概能看到


看到content-range 187770-6674158,請求數據的範圍,下面就可以直接下載了。

學會這招,再也不怕下載大文件失敗了

下載完成,解壓看一下,文件是否一致

學會這招,再也不怕下載大文件失敗了

和我通過瀏覽器直接下載的一樣


分享到:


相關文章: