tqdm+requests:显示下载速度
目录
Introduction
在进行大规模数据爬取和下载时,经常需要下载大文件,这时候就需要一个可以显示下载进度和速度的工具,以便于我们能够更好地掌控下载的情况,同时也可以避免下载过程中出现问题导致浪费时间和流量。
因此,我们需要一个可以显示下载进度和速度的工具,以便于我们更好地掌控下载的情况,避免浪费时间和流量。
本文将介绍在 Python 中如何使用 tqdm 和 requests 来实现下载进度和速度的显示。
How
要使用 tqdm 和 requests 来显示下载进度和速度,我们需要先安装 tqdm 和 requests 模块。安装方法如下(如已安装请跳过):
1 | pip install tqdm requests |
安装完成后,我们可以使用以下代码来下载文件并显示下载进度和速度:
1 | from pathlib import Path |
这段代码的核心是 tqdm,我们使用 tqdm 来创建进度条,然后在循环中更新进度条,实现了下载进度和速度的显示。详细解释如下:
unit="B"
:将进度条的单位设置为字节。unit_scale=True
:开启自动缩放功能,根据文件大小自动转换为 KB、MB、GB 等单位,默认是用 SI 公制单位(即 1000 进制),如果想使用二进制单位,则可以指定下面的unit_divisor
。unit_divisor=1024
:设置单位缩放的除数为1024,即二进制单位。miniters=1
:设置进度条更新的最小步数。对于小文件,进度条可能会更新得太频繁,这个参数可以控制更新频率。desc="Downloading"
:设置进度条的描述。total=size
:设置要下载的文件的总大小,这个值从HTTP响应的Content-Length
头部获取。pbar.update(len(chunk))
:更新进度条,显示已下载的数据大小。len(chunk)
表示当前下载的数据块大小(单位为字节)。
效果如下:
Alternative
又是设置一堆 tqdm 参数又是需要在循环中增加 update 语句,可能有些人会觉得稍显麻烦,有点侵入性,那我这里有一个不那么麻烦的的近似方法:
1 | def download(url, folder) -> str: |
这个程序只需要在原来的 r.iter_content()
外像平常一样包一层 tqdm,然后设置较少的参数即可,省掉了一些参数和 update 语句:
total=n_chunks
:由于我们是分块下载的,一个很明显的思路是 total 我们只需要设置为总的块数即可,和深度学习中的 batch 类似。unit="KB"
:这里我们门强制让其使用KB
为单位,而不是自动转换。unit_scale=chunk_size / 1024
:由于 total 设置的是块的数量,默认速度就会显示每秒多少个块,但是我们想让其显示每秒多少 B 或者 KB 之类的,这里我们就用这个参数来让块数 ⨉ 块大小得出来 B 数,然后再除以 1024 的到 KB 数。如果你想得到 MB 数,只需再除以 1024,并设置unit="MB"
即可。
为什么说这是“近似”做法呢?这是因为我们 unit_scale
直接乘的是块大小,然而每次得到的数据量并不一定是块大小这么大,最后一个块可能会偏小。道理很简单,把 10 按块大小为 3 拆分,最后一个块大小为 1。但是由于我们的块大小不会太大,这个影响微乎其微。
Thoughts
进度和速度显示可能是很多程序员忽略的一个问题,但是我觉得非常重要,可以说 you always need ETA(tqdm)。但是在使用的时候要注意刚开始的速度可能并不准确,尤其是任务队列中的处理时间不尽相同时。