使用Python脚本自己实现数据下载,还有花哨的下载进度显示

这篇博客简单介绍python下载文件,并加入花哨的下载进度显示方法,涉及Python文件操作的技巧,和一些函数库的使用。

环境

  • Python 3.6
  • requests模块
  • 对应文件的下载链接
    (是不是很少东西?那必须,python就是这么强大!)

干货

下面直接上代码,关键是简单易懂,复制就能用,拿走不谢。

import sys
import requests
import os

# 屏蔽warning信息,因为下面verify=False会报警告信息
requests.packages.urllib3.disable_warnings()


def download(url, file_path):
    # verify=False 这一句是为了有的网站证书问题,为True会报错
    r = requests.get(url, stream=True, verify=False)

    # 既然要实现下载进度,那就要知道你文件大小啊,下面这句就是得到总大小
    total_size = int(r.headers['Content-Length'])
    temp_size = 0

    with open(file_path, "w") as f:
        # iter_content()函数就是得到文件的内容,
        # 有些人下载文件很大怎么办,内存都装不下怎么办?
        # 那就要指定chunk_size=1024,大小自己设置,
        # 意思是下载一点写一点到磁盘。
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                temp_size += len(chunk)
                f.write(chunk)
                f.flush()
                #############花哨的下载进度部分###############
                done = int(50 * temp_size / total_size)
                # 调用标准输出刷新命令行,看到\r回车符了吧
                # 相当于把每一行重新刷新一遍
                sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
                sys.stdout.flush()
    print()  # 避免上面\r 回车符,执行完后需要换行了,不然都在一行显示


if __name__ == '__main__':

    link = r'https://api.gdc.cancer.gov/data/'
    UUID = r'2a4a3044-0b1a-4722-83ed-43ba5d6d25b0'
    # path是下载文件保存的路径
    path = r'F:\SYY\temp\a.txt'
    # url是文件网址链接
    url = os.path.join(link, UUID)
    # 调用上面下载函数即可
    download(url, path)

讲解

调用requests库函数时,默认verify=True,这会导致一个问题,当你的浏览器和网站SSL不匹配时,会报错。那解决办法也非常简单,就是把verify=False 这一句换成上一句。

既然要实现下载进度,那就要知道你要下载文件的总大小,还有你已经下载到的文件大小,那这些信心从哪得到呢?一般网页的Content-Length 就包含下载文件总大小,然后temp_size += len(chunk) 就是得到每次本地已经下载的文件大小,这样就能实现下载进度了(百分比)。

花哨的部分讲解,上面代码中调用标准输出刷新命令行,看到\r回车符了吧,相当于每次循环就回车到命令行首,把每一行重新刷新一遍,所以看起来是动态的下载。

有些人下载文件很大怎么办,内存都装不下怎么办?那就要指定chunk_size = 1024,具体大小可以自己设置, 意思是下载一点chunk 就写一点到磁盘。又有人问了,那我下载下载就断了,前面那些不是白下了。。。其实这个问题可以用断点续传解决,但是前提是,该网站的文件支持断点续传。断点续传的代码可以看我另一篇文章

图片展示

这里写图片描述

断点续传博客链接:
https://blog.csdn.net/qq_35203425/article/details/80987880

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值