欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-09 09:23:54
...

这篇博客简单介绍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 就写一点到磁盘。又有人问了,那我下载下载就断了,前面那些不是白下了。。。其实这个问题可以用断点续传解决,但是前提是,该网站的文件支持断点续传。断点续传的代码可以看我另一篇文章

图片展示

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

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

相关标签: 下载