python 文件下載之?dāng)帱c(diǎn)續(xù)傳的實(shí)現(xiàn)
1.前序
當(dāng)下載突然斷開后,斷點(diǎn)續(xù)傳就需要了,繼續(xù)前面下載的內(nèi)容下載。解決了不需要重復(fù)下載
2.技術(shù)原理
HTTP/1.1 開始支持?jǐn)帱c(diǎn)續(xù)傳,一般斷點(diǎn)下載會(huì)用到 Range 和 Content-Range 實(shí)體頭
Range是請(qǐng)求頭,Content-Range是響應(yīng)頭
2.1 Content-Range
用于響應(yīng)頭中
語法:
Content-Length: <length>
2.2 Range
Range
HTTP 請(qǐng)求頭表示服務(wù)器應(yīng)返回的文檔部分。可以同時(shí)用一個(gè)頭請(qǐng)求多個(gè)部件,服務(wù)器可以在多部分文檔中發(fā)回這些范圍。如果服務(wù)器發(fā)回范圍,則使用 206 部分內(nèi)容進(jìn)行響應(yīng)。如果范圍無效,服務(wù)器會(huì)返回 416 范圍不可滿足的錯(cuò)誤。服務(wù)器還可以忽略標(biāo)題,然后返回整個(gè)文檔,并返回 200 狀態(tài)代碼。
語法:
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=-<suffix-length>
unit
:指定范圍的單位,通常是bytes。
range-start
:指示請(qǐng)求范圍開始的給定單元中的整數(shù)。
range-end
:給定單元中的整數(shù),指示所請(qǐng)求范圍的末尾。此值是可選的,如果省略,文檔的末尾將被視為范圍的末尾。
suffix-length
:給定單位中的整數(shù),指示要返回的文件末尾的單位數(shù)。
例子:
(1)從文件中請(qǐng)求三個(gè)范圍。第一個(gè)范圍為第200字節(jié)到第1000個(gè)字節(jié)的位置;第二個(gè)范圍為第2000個(gè)字節(jié)位置到第6576個(gè)字節(jié)的位置;第三個(gè)范圍為第19000字節(jié)位置之后的全部
Range: bytes=200-1000, 2000-6576, 19000-
(2)請(qǐng)求文件的前 500 和最后 500 字節(jié)。如果范圍重疊,服務(wù)器可能會(huì)拒絕該請(qǐng)求。
Range: bytes=0-499, -500
3. 代碼實(shí)現(xiàn)
import requests import os headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36' } file_path = './video/1.mp4' # 存儲(chǔ)地址 url = 'https://v3-dy-o.zjcdn.com/410b9087e76fe2360e320463f8586ed8/6185ea7a/video/tos/cn/tos-cn-ve-15-alinc2/62427caf076b4d7d9dbbdbea98f97c9f/?a=6383&br=2690&bt=2690&cd=0%7C0%7C0&ch=26&cr=0&cs=0&cv=1&dr=0&ds=3&er=&ft=jal9w1-eTz7ThWR7Wlct&l=021636162458101fdbd400a040000000a70125e00000141b4be97&lr=all&mime_type=video_mp4&net=0&pl=0&qs=0&rc=M3U8bDw6ZmZsODMzNGkzM0ApPDY3Ozs7Mzw7NzY6N2g0aWdqNGVfcjRnZG5gLS1kLTBzczU2MV40Ly40NmAtLV8xLWI6Yw%3D%3D&vl=&vr=' r = requests.get(url,headers=header) total_size = int(r.headers['Content-Length']) # 查看文件大小,并轉(zhuǎn)換為整數(shù)類型 print(r.headers) # 查看本地下載了多少 if os.path.exists(file_path): temp_size = os.path.getsize(file_path) # 本地已經(jīng)下載的文件大小 else: temp_size = 0 print('已下載:' + temp_size) print('總共需要下載:' + total_size) header['Range'] = 'bytes={}-'.format(temp_size) # 向頭加入Range信息 print(header) # 打印頭信息 r = requests.get(url, headers=header, stream=True) with open(file_path, "ab") as f: for chunk in r.iter_content(chunk_size=1024): if chunk: temp_size += len(chunk) f.write(chunk)
現(xiàn)在不知到怎么做突然下載被停止后,數(shù)據(jù)能寫入文件了,所以現(xiàn)在是手動(dòng)模擬下載斷開。
在寫入文件中加入了一個(gè)判斷,當(dāng)文件下載了5M時(shí)停止下載,之后再刪掉這段代碼,在重新下載。
with open(file_path, "ab") as f: for chunk in r.iter_content(chunk_size=1024): if chunk: temp_size += len(chunk) f.write(chunk) if temp_size > 1024 *1024 * 5: break
第一次下載
第二次下載
到此這篇關(guān)于python 文件下載之?dāng)帱c(diǎn)續(xù)傳的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python 斷點(diǎn)續(xù)傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用Python實(shí)現(xiàn)大文件切片上傳及斷點(diǎn)續(xù)傳的方法
- 詳解Python中的斷點(diǎn)類型
- python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法
- 基于python實(shí)現(xiàn)Pycharm斷點(diǎn)調(diào)試
- Python PyCharm如何進(jìn)行斷點(diǎn)調(diào)試
- python3射線法判斷點(diǎn)是否在多邊形內(nèi)
- 利用Pycharm斷點(diǎn)調(diào)試Python程序的方法
- python實(shí)現(xiàn)可以斷點(diǎn)續(xù)傳和并發(fā)的ftp程序
- python支持?jǐn)帱c(diǎn)續(xù)傳的多線程下載示例
- python斷點(diǎn)測(cè)試的實(shí)現(xiàn)
相關(guān)文章
Python range函數(shù)之生成器函數(shù)的示例
這篇文章主要介紹了Python range函數(shù)之生成器函數(shù)的示例,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12Python中猜拳游戲與猜篩子游戲的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Python中猜拳游戲與猜篩子游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python reshape的用法及多個(gè)二維數(shù)組合并為三維數(shù)組的實(shí)例
今天小編就為大家分享一篇Python reshape的用法及多個(gè)二維數(shù)組合并為三維數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02解決tensorflow讀取本地MNITS_data失敗的原因
這篇文章主要介紹了解決tensorflow讀取本地MNITS_data失敗的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06