python如何批量下载大文件(支持断点续传)

1.python下载大文件(支持断点续传)

网上的很多爬取图片的程序,基本使用scrapy框架中的img管道进行加速下载,但是当要下载的文件太大的时候,scrapy框架中的文件下载管道也无能为力的时候,也确实听让人无奈,于是我写下了如下代码,其功能如下:

1.读取本地 ./english.txt 文件中的下载链接
2.for循环调用 download 函数分别下载各个下载链接
3.保存到本地(支持断点续传)

以下就是全部的代码,如果大家用得到就可以点赞支持一下。

# -*- coding:utf-8 -*-

'''

@项目名称:保密

@作者:kingback

@文件名称:Continue_big_files_download.py

@IDE:PyCharm

@文件创建时间:2021-04-16 14:45:20

@月份:4月


'''

import sys
import requests
import os

# 屏蔽warning信息
requests.packages.urllib3.disable_warnings()

def download(url):
    name = url.split('/')[-1]
    print("当前正在下载文件:",name)
    dir = "你的文件存储路径"		#此处的路径需要改成自己的路径
    filename=dir+name
    # 第一次请求是为了得到文件总大小
    r1 = requests.get(url, stream=True, verify=False)
    total_size = int(r1.headers['Content-Length'])
    # 这重要了,先看看本地文件下载了多少
    if os.path.exists(filename):
        temp_size = os.path.getsize(filename)  # 本地已经下载的文件大小
    else:
        temp_size = 0
    '''
    是否续传?
    '''
    if(temp_size==total_size):
        print("该文件已经下载过了!")
    else:
        # 显示一下已经下载了多少
        print("续传文件大小:%s,文件总大小:%s" % (temp_size, total_size))
        # 核心部分,这个是请求下载时,从本地文件已经下载过的后面下载
        headers = {'Range': 'bytes=%d-' % temp_size}
        # 重新请求网址,加入新的请求头的
        r = requests.get(url, stream=True, verify=False, headers=headers)

        # 下面写入文件也要注意,看到"ab"了吗?
        # "ab"表示追加形式写入文件
        with open(filename, "ab") as f:
            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)
                    sys.stdout.write("    《-----------下载进度:")

                    sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
                    sys.stdout.flush()
    print()  # 避免上面\r 回车符


if __name__ == '__main__':

    txt_path = "./english.txt"			#此处填写你的下载链接所在的txt路径
    # 读取所有url
    with open(txt_path, "r") as f:
        data = f.read()
    datas = data.split("\n")			#转成list,便于读取

    # 去重,去掉list列表中重复的内容
    datas = list(set(datas))
    #初始化输出,告诉使用者需要下载多少文件
    print("\n","*"*30,"总共需要下载文件:%s个"%len(datas),"*"*30,"\n")
    # 开始下载文件
    for file in datas:
        download(file)

2.使用截图

使用很方便哦~
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王延凯的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值