Python多线程下载文件实例代码

python 实现多线程下载m3u8格式视频并使用fmmpeg合并 这篇文章主要介绍了python 实现多线程下载m3u8格式视频,使用fmmpeg合并的实例代码,需要的朋友可以参考下 @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 电影之类的长视频好像都用m3u8格式了,这就导致了多线程下载视频的意义不是很大,都是短视频,线不线程就没什么意义了嘛。 我们知道,m3u8的链接会下载一个文档,相当长,半小时的视频,应该有接近千行ts链接。 这些... 阅读详情
Python实现多线程 下载文件的方法与实例代码。

实现简单的多线程下载,需要关注几点:
1.文件的大小:可以从reponse header中提取,如“Content-Length:911”表示大小是911字节
2.任务拆分:指定各个线程下载的文件的哪一块,可以通过request header中添加“Range: bytes=300-400”(表示下载300~400byte的内容),注意可以请求的文件的range是[0, size-1]字节的。
3.下载文件的聚合:各个线程将自己下载的文件块保存为临时文件,所有线程都完成后,再将这些临时文件按顺序聚合写入到最终的一个文件中。
实现代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# filename: paxel.py
# edit: www.jbxue.com
# Jay modified it a little and save for further potential usage.

'''It is a multi-thread downloading tool


    It was developed following axel.
        Author: volans
        E-mail: volansw [at] gmail.com
'''

import sys
import os
import time
import urllib
from threading import Thread


# in case you want to use http_proxy
local_proxies = {'http': 'http://131.139.58.200:8080'}

class AxelPython(Thread, urllib.FancyURLopener):
    '''Multi-thread downloading class.

        run() is a vitural method of Thread.
    '''
    def __init__(self, threadname, url, filename, ranges=0, proxies={}):
        Thread.__init__(self, name=threadname)
        urllib.FancyURLopener.__init__(self, proxies)
        self.name = threadname
        self.url = url
        self.filename = filename
        self.ranges = ranges
        self.downloaded = 0


    def run(self):
        '''vertual function in Thread'''
        try:
            self.downloaded = os.path.getsize(self.filename)
        except OSError:
            #print 'never downloaded'
            self.downloaded = 0

        # rebuild start poind
        self.startpoint = self.ranges[0] + self.downloaded

        # This part is completed
        if self.startpoint >= self.ranges[1]:
            print 'Part %s has been downloaded over.' % self.filename
            return

        self.oneTimeSize = 16384  # 16kByte/time
        print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])

        self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))
        self.urlhandle = self.open(self.url)

        data = self.urlhandle.read(self.oneTimeSize)
        while data:
            filehandle = open(self.filename, 'ab+')
            filehandle.write(data)
            filehandle.close()

            self.downloaded += len(data)
            #print "%s" % (self.name)
            #progress = u'\r...'

            data = self.urlhandle.read(self.oneTimeSize)
 
def GetUrlFileSize(url, proxies={}):
    urlHandler = urllib.urlopen(url, proxies=proxies)
    headers = urlHandler.info().headers
    length = 0
    for header in headers:
        if header.find('Length') != -1:
            length = header.split(':')[-1].strip()
            length = int(length)
    return length
 
def SpliteBlocks(totalsize, blocknumber):
    blocksize = totalsize / blocknumber
    ranges = []
    for i in range(0, blocknumber - 1):
        ranges.append((i * blocksize, i * blocksize + blocksize - 1))
    ranges.append((blocksize * (blocknumber - 1), totalsize - 1))

    return ranges
 
def islive(tasks):
    for task in tasks:
        if task.isAlive():
            return True
    return False
 
def paxel(url, output, blocks=6, proxies=local_proxies):
    ''' paxel
    '''
    size = GetUrlFileSize(url, proxies)
    ranges = SpliteBlocks(size, blocks)

    threadname = ["thread_%d" % i for i in range(0, blocks)]
    filename = ["tmpfile_%d" % i for i in range(0, blocks)]

    tasks = []
    for i in range(0, blocks):
        task = AxelPython(threadname[i], url, filename[i], ranges[i])
        task.setDaemon(True)
        task.start()
        tasks.append(task)

    time.sleep(2)
    while islive(tasks):
        downloaded = sum([task.downloaded for task in tasks])
        process = downloaded / float(size) * 100
        show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
        sys.stdout.write(show)
        sys.stdout.flush()
        time.sleep(0.5)

    filehandle = open(output, 'wb+')
    for i in filename:
        f = open(i, 'rb')
        filehandle.write(f.read())
        f.close()
        try:
            os.remove(i)
            pass
        except:
            pass

    filehandle.close()

if __name__ == '__main__':
    url = 'http://dldir1.qq.com/qqfile/QQforMac/QQ_V3.1.1.dmg'
    output = 'download.file'
    paxel(url, output, blocks=4, proxies={})
您可能感兴趣的文章:
【python实战】多线程下载文件 python多线程及文件拼接练习 阅读详情

相关推荐

AI 辅助代码审查:开启代码质量管控的智能时代

AI辅助代码审查正在改变传统的代码质量管控方式。通过自动化分析、智能反馈和上下文感知,AI不仅提高了代码审查的效率,还提升了代码质量的一致性和可维护性。随着机器学习和深度学习技术的不断发展,未来AI将成为开发者日常工作中强大的助手,进一步推动软件开发向智能化、自动化方向发展。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 3228

Python编程:多线程断点下载文件

大多数网站为了服务器宽带均衡使用,会限制单个连接的传输速度。有时需要下载几百MB大小文件,但下载速度只有100~200KB/S的时候,可以采用python开多线程流式下载该文件以加快下载速度。

wsfsp_4的博客 2534

【RTOS】 Vxworks 653 第一章 —— 初识 vx653 3.x

。。不是很重要,自己搜吧鲁棒分区是一种确保共享计算资源中独立运行功能实现​​时空隔离​​的机制,其目标是为集成模块中的混合临界性应用提供与联邦式部署(federated implementation)同等级别的功能隔离保障。具体表现为:​​多关键性共存​​:支持不同安全等级应用(如飞控系统A级与娱乐系统D级)在同一模块中协同运行。​​抗干扰能力​​:防止未授权或意外的时空干扰(如内存越界、时间窗口冲突),确保应用间互不影响。​​。

qq_38183694的博客 1280

多线程文件下载

从文件列表ile_library下载的文件将存储在downloaded文件夹中,从本地上传的文件将存储在文件列表中(请注意文件列表中不能已经存在将要上传的文件)首先运行server.py,然后打开client.py,输入用户名和密码,初次使用会创建两个文件夹,若想上传文件还需自行创建一个文件作为本地可上传文件,如333。

qq_73201992的博客 311

Windows环境下DataEase一站式安装指南(含WSL2+Docker配置)

本文详细介绍了在Windows环境下通过WSL2和Docker快速部署DataEase的完整教程。从WSL2配置、Docker环境搭建到DataEase离线安装,逐步指导用户完成一站式部署,特别适合需要快速搭建数据分析平台的开发者。教程包含常见问题解决方案和性能优化技巧,帮助用户高效使用这款国产开源数据可视化工具。

weixin_42526166的博客 393

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 163

Python:教你如何实现多线程下载器

Python 实现多线程下载器

有意栽花花不发,无心插柳柳成荫。 7686

【超简单】一文入门在Ubuntu系统使用GitHub

Github是基于git的代码仓库,对于开发项目的科研者或者工程师,代码仓库都是不可多得的版本控制与多端编程工具,今天这篇文章带你轻松Github入门,简单的项目本文的操作足矣。

a13337649640的博客 5236

【Python】使用requests库实现多线程下载大文件

1.当我们请求下载文件的时候,可以使用head请求看一下该文件有多大,响应头里的“Content-Length”字段表示文件的字节数。使用使用requests库可以实现网络请求,但如果用于下载大文件,单线程下载确实不能很好地利用宽度,改为多线程会更好一点。2.拿到了文件大小之后,根据线程数划分为多个数据块,即每个线程都请求一部分,在请求头的“Range”字段指定下载范围。5.如果发现其中一个块下载失败了,那就相当于整个文件都失败了,不过我还是希望再尝试下载2次才确定失败。

冰冷的希望的博客 4905

Krylov子空间与Arnoldi过程

一、应用背景 Krylov子空间方法是模型降阶(MOR)的一种,Krylov 子空间方法就是在Krylov子空间中寻找近似解。 二、Krylov子空间 n是原始矩阵的维度,m为降阶后矩阵的维度,通常m<<n。 三、Arnoldi 过程: 计算Km 的一组正交 对应上述MGS过程的python代码: import numpy as np def arnoldi_itera...

保持写作习惯,完成知识沉淀 6001

Coze实战:解锁多Bot协同与条件分支工作流的奥秘

本文详细介绍了在字节跳动Coze平台实现多Bot协同与条件分支工作流的方法。首先阐述了Coze平台的功能优势,包括丰富的插件、知识库和工作流功能。随后分步骤讲解了多Bot协同的实现:从准备工作、创建Bot到协同配置,并提供了电商客服的实例演示。在条件分支工作流部分,详细说明了条件节点的作用类型、条件设定方法以及具体配置操作,强调测试优化的重要性。最后通过电商平台综合案例,展示了多Bot协同与条件分支的实际应用效果,并针对常见问题提供解决方案。文章为开发者在Coze平台上构建智能应用提供了实用指导,有助于提升

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 450

从0到1手把手教你实现一个 Python 多线程下载器

本文是来自读者Sheep投稿https://zhuanlan.zhihu.com/p/369531344前言下载文件是我们生活中的一个常见的需求,因此衍生的下载工具也非常多,各有各的优势以...

涛哥聊Python 1466

Newton & Nvidia 开源 GPU 加速机器人仿真器入门教程(一)

Newton 是一个 GPU 加速、可扩展和可微分的物理仿真引擎,专为机器人、研究和高级仿真工作流而设计。Newton 基于 NVIDIA Warp 并集成了 MuJoCo Warp,为用户和开发人员提供了高性能仿真、现代 Python API 和灵活的架构。

机器人控制与仿真应用 1482

python多线程下载代码_Python实现多线程下载文件的代码实例

实现简单的多线程下载,需要关注如下几点:1.文件的大小:可以从reponse header中提取,如“Content-Length:911”表示大小是911字节2.任务拆分:指定各个线程下载的文件的哪一块,可以通过request header中添加“Range: bytes=300-400”(表示下载300~400byte的内容),注意可以请求的文件的range是[0, size-1]字节的。3....

weixin_39535217的博客 187

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python多线程下载多个文件_Python实现多线程下载文件的代码实例

实现简单的多线程下载,需要关注如下几点:1.文件的大小:可以从reponse header中提取,如“Content-Length:911”表示大小是911字节2.任务拆分:指定各个线程下载的文件的哪一块,可以通过request header中添加“Range: bytes=300-400”(表示下载300~400byte的内容),注意可以请求的文件的range是[0, size-1]字节的。3....

weixin_39670545的博客 365

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

python多线程下载大文件_Python threading多线程断点下载文件的方法

这是玩蛇网一篇关于Python多线程下载文件方法的代码实例。文中应用到的python模块和方法有httplib、Python urllib2、Python threading多线程模块、python queue、sleep,这些方法或是模块的具体实现流程可以参考本站的相关文章介绍。这是作者用了一小时左右写出来的python抓取文件的代码,喜欢的朋友可以拿去改进下。例如断点续传文件、多线程队列下载文...

weixin_39608301的博客 219

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python多线程下载器_python写的多线程下载工具

其实只是想练习一下threading的用法。写完后发现其实下载速度也没增加多少,略显尴尬,汗# -*- coding: cp936 -*-import urllib2import threadingimport os,os.pathimport sysimport time,datetimeurl = ''path = os.getcwd()file_name = ''file_fp=''net_...

weixin_30106425的博客 216

python requests模块_教你用11 种方法高效下载 Python 资源!

点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!天天向上|译者数据管道|来源https://dzone.com/articles/simple-examples-of-downloading-files-using-python在本教程中,你将学习如何使用不同的Python模块从web下载文件。此外,你将下载常规文件、web页面、Amazon S3和其...

weixin_39655160的博客 1072

python 网络爬虫(三) 多线程,gzip加速,网页下载

上一篇的 python 网络爬虫(二) BFS不断抓URL并放到文件中 其实还不够正常,很少看到不用多线程的爬虫。 本篇补充如下功能: 【1】维护一个公用队列,开启多线程,对这个队列进行获取URL和处理 【2】对页面的下载,放到特定的文件夹中 【3】下载请求用gzip形式下载到本地解压,降低网络资源负荷 python每一时刻只能处理一个线程,多线程有的时候因为切换线程而拖慢速度,但是为什

要不,单步调试走起? 7597

Python文件下载实战技巧全解析

【代码】Python文件下载实战技巧全解析。

2402_82905773的博客 160

python global的作用_解析python多线程与global变量

对python多线程与global变量详解今天早上起来写爬虫,基本框架已经搭好,添加多线程爬取功能时,发现出错:比如在下载文件的url列表中加入200个url,开启50个线程。我的爬虫…竟然将50个url爬取并全部命名为0.html,也就是说,最后的下载结果,是有1个0.html(重复的覆盖了),还有1-150。下面是我的代码:x = str(theguardian_globle.g)#x为给下载...

weixin_39722759的博客 461

python 选择题 多线程_Python基础(9)——多线程、多进程、单元测试

importthreadpoolimportrequestsimportauto_installimportthreadingdefdown_load_pics(url):print(threading.current_thread())print('开始下载',url)r=requests.get(url)file_name=auto_install.InstallRequrie.md5(url...

weixin_39664995的博客 267

使用python爬虫爬取迅雷侠下载,呵呵,你懂得

import urllib.request from lxml import etree import threading from multiprocessing import Pool from multiprocessing.dummy import Pool as ThreadPool #请求 #三种浏览器的user-agent #headers = {'User-Agent'

龙图腾的博客 1万+

Python实现多线程并发下载大文件(断点续传支持)

本文非常浅层的演示了python如何实现多线程文件下载,核心取决于现代服务器基本都支持范围下载的前提下。关于断点续传,文章已提供基本理论和实现思路,有兴趣通过python实现下载器的朋友都可以专门去实现一下。......

小小明-代码实体的专栏 5万+

Python多线程实现大文件快速下载

本文介绍了使用Python实现多线程下载大文件的方法。通过将文件分成多个部分并发下载,可以显著提高下载速度。文章详细讲解了多线程下载原理,并提供了基于concurrent.futures.ThreadPoolExecutor的完整代码实现,包括文件分块、并发下载和合并等关键步骤。同时指出了实际应用中需要注意的服务器支持、线程数量选择等技术细节,为高效下载大文件提供了实用解决方案。

Nicky's blog 936
上一篇: Linux Shell脚本查看Java线程的CPU使用情况
下一篇: jQuery setTimeout传递字符串参数报错怎么办?解决方法
my_baby_2009
博客等级 码龄14年 31粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值