先上代码,后面有空再整理细节:
# -*- coding:utf-8 -*- # vim:et:ts=4:sw=4: #!/usr/bin/env python ###################################################################### __author__ = 'ishenweiyan@qq.com' __create__ = '2019-09-19' __file__ = 'download_demo.py' __license__ = '2019 All rights reserved.' __doc__ = 'The test script.' ##################################################################### import os from urllib.request import urlopen import requests from tqdm import tqdm from contextlib import closing class ProgressBar(object): def __init__(self, title, count=0.0, run_status=None, fin_status=None, total=100.0, unit='', sep='/', chunk_size=1.0): super(ProgressBar, self).__init__() self.info = "[%s] %s %.2f %s %s %.2f %s" self.title = title self.total = total self.count = count self.chunk_size = chunk_size self.status = run_status or "" self.fin_status = fin_status or " " * len(self.status) self.unit = unit self.seq = sep def __get_info(self): # [名称] 状态 进度 单位 分割线 总数 单位 _info = self.info % (self.title, self.status, self.count/self.chunk_size, self.unit, self.seq, self.total/self.chunk_size, self.unit) return _info def refresh(self, count=1, status=None): self.count += count # if status is not None: self.status = status or self.status end_str = "\r" if self.count >= self.total: end_str = '\n' self.status = status or self.fin_status print(self.__get_info(), end=end_str) def download_from_url(url, dst): """ @param: url to download file @param: dst place to put the file """ file_size = int(urlopen(url).info().get('Content-Length', -1)) if os.path.exists(dst): first_byte = os.path.getsize(dst) else: first_byte = 0 if first_byte >= file_size: return file_size header = {"Range": "bytes=%s-%s" % (first_byte, file_size)} pbar = tqdm( total=file_size, initial=first_byte, unit='B', unit_scale=True, desc=url.split('/')[-1]) req = requests.get(url, headers=header, stream=True) with(open(dst, 'ab')) as f: for chunk in req.iter_content(chunk_size=1024): if chunk: f.write(chunk) pbar.update(1024) pbar.close() return file_size def __main__(): url = 'http://ftp.ncbi.nlm.nih.gov/gene/DATA/gene2ensembl.gz' file_name = 'gene2ensembl.gz' ''' with closing(requests.get(url, stream=True)) as response: chunk_size = 1024 # 单次请求最大值 content_size = int(response.headers['content-length']) # 内容体总大小 progress = ProgressBar(file_name, total=content_size, unit="KB", chunk_size=chunk_size, run_status="正在下载", fin_status="下载完成") with open(file_name, "wb") as file: for data in response.iter_content(chunk_size=chunk_size): file.write(data) progress.refresh(count=len(data)) ''' download_from_url(url, file_name) if __name__ == "__main__": __main__()
参考资料
- Python玩家,《自制一个python下载文件的进度条模块!》,CSDN
- 微寒Super,《Python3使用requests模块显示下载进度》,CSDN
- Kenneth Reitz,《高级用法 — Requests 2.18.1 文档》,Requests 2.18.1 文档
- 昊天 seo,《Python3 使用requests模块显示下载视频并且显示进度》,WordPress 博客