学会这招,再也不怕下载大文件失败了

学会这招,再也不怕下载大文件失败了

学会这招,再也不怕下载大文件失败了

点击上方“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,请求数据的范围,下面就可以直接下载了。

学会这招,再也不怕下载大文件失败了

下载完成,解压看一下,文件是否一致

学会这招,再也不怕下载大文件失败了

和我通过浏览器直接下载的一样


分享到:


相關文章: