不知道你有没有遇到过这种情况,下载文件过程十分缓慢,缓慢也就算了。关键是马上要下载好的时候,它竟然失败了,还不支持继续下载,

今天我们就来解决这个小问题

先贴代码

import sysimport requestsimport osdef download(url, file_path):    # 第一次请求是为了得到文件总大小    response = requests.get(url, stream=True, verify=False)    print(response.status_code)    #加入异常处理,如果异常直接退出    #这里加入异常处理是由于,有时请求数据会不携带 Content-Length,导致无法正常下载数据    #因此一旦出现这种情况,就需要多运行几次了,    # 在我下载github测试时,有时会运行三四次才能够正常下载    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("[%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)

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的一个目标检测的项目

效果如下,这里没有进行录屏,大家可以自己尝试一下


文件下载 no data found for resource with g_github


我们使用debug模式看一下response headers 都有什么


文件下载 no data found for resource with g_请求数据_02


先看一下本地变量,全部是大小6674159字节,当前已经下载了1877700 字节


文件下载 no data found for resource with g_字节数_03


这个图是我通过手机拍摄的,有点模糊,但是大概能看到

看到content-range 187770-6674158,请求数据的范围,下面就可以直接下载了。


文件下载 no data found for resource with g_github_04


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


文件下载 no data found for resource with g_请求数据_05


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