# CY3761 | 2021-12-23 22:39
import os.path
import time
from fake_useragent import UserAgent
from requests import get
from tqdm import tqdm
# https://pypi.org/project/tqdm/
# 下载文件地址 保存文件地址 不存入默认当前目录下的下载文件名
def download(u, filename=None, isRemove=False):
# stream=True 用流stream的方式获取url的数据
resp = get(u, stream=True, headers={
'User-Agent': UserAgent().random
})
if resp.status_code != 200:
raise Exception('请求错误', resp.status_code)
# 拿到文件的长度,并把total初始化为0
total = int(resp.headers.get('content-length', 0))
if total <= 0:
raise Exception(f'下载文件长度({total})不正常')
if filename is True:
filename = None
isRemove = True
# 保存文件地址 不存入默认当前目录下的下载文件名
if not filename:
filename = u.split('/')[-1]
if os.path.exists(filename): # 文件存在就不再执行下载
raise Exception(f'{filename} 文件已存在')
chunk_size = 1024 # 块大小
# https://zhuanlan.zhihu.com/p/163613814
# https://tqdm.github.io/docs/tqdm/#__init__
# 各参数意义
"""
def __init__(self, iterable=None, desc=None, total=None, leave=False,
file=sys.stderr, ncols=None, mininterval=0.1,
maxinterval=10.0, miniters=None, ascii=None,
disable=False, unit='it', unit_scale=False,
dynamic_ncols=False, smoothing=0.3, nested=False,
bar_format=None, initial=0, gui=False):
iterable: 可迭代的对象, 在手动更新时不需要进行设置
desc: 字符串, 左边进度条描述文字
total: 总的项目数
leave: bool值, 迭代完成后是否保留进度条
file: 输出指向位置, 默认是终端, 一般不需要设置
ncols: 调整进度条宽度, 默认是根据环境自动调节长度, 如果设置为0, 就没有进度条, 只有输出的信息
unit: 描述处理项目的文字, 默认是'it', 例如: 100 it/s, 处理照片的话设置为'img' ,则为 100 img/s
unit_scale: 自动根据国际标准进行项目处理速度单位的换算, 例如 100000 it/s >> 100k it/s | 为True时 unit_divisor 有效
unit_divisor: 找不到有效答案
进度百分比|进度条| 当前迭代数/总迭代个数 [消耗时间<剩余时间,迭代的速度]
"""
with open(filename, 'wb') as file, tqdm(
desc=f'正在下载 {u} ',
total=total,
unit='B',
unit_scale=True,
# unit_divisor=chunk_size, # 每一进度的数据大小 感觉可以没有
colour='#00ff00', # 进度条颜色 仅编辑器内有效
) as bar:
# resp.iter_content 来边下载边存硬盘
# chunk_size 块大小: 读入内存的字节数
for data in resp.iter_content(chunk_size=chunk_size):
size = file.write(data)
bar.update(size)
if os.path.exists(filename) and isRemove is True:
os.unlink(filename) # 进行删除, 避免测试需要手动删除麻烦
def demo_0():
for _ in tqdm(range(int(1e3))):
time.sleep(1e-5)
def demo_1():
ot = tqdm([chr(_) for _ in range(65, 90 + 1)]) # A-Z 26
for _ in ot:
ot.set_description(_)
time.sleep(0.4) # 0.4*(26-1)=10S
def demo_2():
ot = tqdm(total=1000)
for i in range(100):
ot.update(10) # 10*100=1000
time.sleep(0.1) # 0.1*100=10s
ot.close()
def demo_3():
try:
download('https://download1.dcloud.net.cn/download/HBuilderX.3.2.16.20211122.full.zip', True)
except (Exception, BaseException) as e:
print(e)
if __name__ == "__main__":
# demo_0()
# demo_1()
# demo_2()
demo_3()
爬虫 | tqdm 下载进度效果
最新推荐文章于 2024-03-12 14:55:23 发布