ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python下载大文件列表,断点续传,跳过已下载,显示下载进度

2022-06-12 17:01:34  阅读:156  来源: 互联网

标签:断点续传 temp python url savePath print 下载 size


 

一般来说,下载小的文件,跳过已下载、断点续传、显示下载进度价值不大。

 

然而,对于大文件下载列表,

1、如果文件很大,显示下载进度就很重要,要不然不知道是不是在下载;

2、如果加上网络也不稳定,容易断开,每次重新开始也很坑人,断点续传就很有必要了;

3、如果下载一个有很多文件的列表,如果已经下载的能直接跳过,自动从没下载或者没有下载完整的地方开始。直接重新启动程序,代码不作任何修改,不完整的就可以自动补充完整,不亦妙乎。

 

断点续传、显示下载进度、自动跳过,这些单独的算法都有,那么能不能合三为一呢

关键之处在于:

1、如何判断已经下载的都是完整的,总不能每一个文件再都访问一遍网站,获取大小,然后比较吧。速度慢不说,反复一遍遍访问网站也没必要吧。

2、因此,最好是一开始下载的先用临时的文件名(如用.tmp后缀命名),如果下载完整,然后再修改为要下载的文件名。

3、同时,获取下载内容要用上重试,不下载下来,誓不罢休。

 

关于断点续传,这个实现挺不错的。

Python爬虫使用requests下载文件,实现下载大文件断点续传:https://blog.csdn.net/Python_sn/article/details/109167016

 

以下代码系参考以上网友断点续传代码修改而来,备自己所需吧

 

import os,shutil
import csvimport requests
from retrying import retry
import sys

def is_request_exception(e):
    print(e)
    return True

from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 禁用安全请求警告

# 反复重试
@retry(retry_on_exception=is_request_exception,wait_random_min=2000, wait_random_max=10000) def get_retry(url,headers): r = requests.get(url, headers=headers, verify=False, timeout=300, stream=True) return r def DownloadFile_new(url, savePath): #url是下载地址,savePath是保存位置 savePath_tmp = savePath + '.tmp' print("downloading {0}".format(url)) if not os.path.exists(savePath) or os.path.exists(savePath_tmp): try: headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"} response = get_retry(url,headers) response.raise_for_status() # 如果响应状态码不是 200,就主动抛出异常 total_size = int(response.headers['Content-Length']) # print(response.headers) if os.path.exists(savePath_tmp): temp_size = os.path.getsize(savePath_tmp) print("当前:%d 字节, 总:%d 字节, 已下载:%2.2f%% " % (temp_size, total_size, 100 * temp_size / total_size)) if temp_size == total_size: shutil.move(savePath_tmp,savePath) print('已下载完毕') return True else: temp_size = 0 print("总:%d 字节,开始下载..." % (total_size,)) headers = {'Range': 'bytes=%d-' % temp_size, "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"} res_left = get_retry(url, headers) with open(savePath_tmp, "ab") as f: for chunk in res_left.iter_content(chunk_size=1024): 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() if temp_size ==total_size: shutil.move(savePath_tmp,savePath) print('\nsave file succeed\n') except requests.RequestException as e: #出错,记录 print(e) with open('D:/timeout.txt', 'a+',encoding = 'UTF-8') as fw: #读入存储文件路径 fw.write('%s,%s\n' % (url,e)) else: print('文件已下载') with open('D:/下载列表.csv','r',encoding='utf-8') as dl_list: items=csv.reader(dl_list,delimiter='\t') for item in items: url=item[0] savePath=item[1] DownloadFile_new(url, savePath)

 

标签:断点续传,temp,python,url,savePath,print,下载,size
来源: https://www.cnblogs.com/yanghao2008/p/16368311.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有