爬虫 | tqdm 下载进度效果

# 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()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值