时间:2021-05-23
0x01 分析
一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类:
Download类:包含download()和get_complete_rate()两种方法。
ThreadDownload类:该线程类继承了threading.Thread类,包含了一个run()方法。
run()方法主要负责每个线程读取网络数据并写入本地。
0x02 代码
# 文件名:ThreadDownload.pyimport threadingfrom urllib.request import *class Download: def __init__(self, link, file_path, thread_num): # 下载路径 self.link = link # 保存位置 self.file_path = file_path # 使用多少线程 self.thread_num = thread_num # 初始化threads数组 self.threads = [] def download(self): req = Request(url=self.link, method='GET') req.add_header('Accept', '*/*') req.add_header('Charset', 'UTF-8') req.add_header('Connection', 'Keep-Alive') f = urlopen(req) # 获取要下载的文件的大小 self.file_size = int(dict(f.headers).get('Content-Length', 0)) f.close() # 计算每个线程要下载的资源的大小 current_part_size = self.file_size // self.thread_num + 1 for i in range(self.thread_num): # 计算每个线程下载的开始位置 start_pos = i * current_part_size # 每个线程使用一个wb模式打开的文件进行下载 t = open(self.file_path, 'wb') t.seek(start_pos, 0) # 创建下载线程 td = ThreadDownload(self.link, start_pos, current_part_size, t) self.threads.append(td) td.start() # 获下载的完成百分比 def get_complete_rate(self): sum_size = 0 for i in range(self.thread_num): sum_size += self.threads[i].length return sum_size / self.file_sizeclass ThreadDownload(threading.Thread): def __init__(self, link, start_pos, current_part_size, current_part): super().__init__() # 下载路径 self.link = link # 当前线程的下载位置 self.start_pos = start_pos # 定义当前线程负责下载的文件大小 self.current_part_size = current_part_size # 当前文件需要下载的文件快 self.current_part = current_part # 定义该线程已经下载的字节数 self.length = 0 def run(self): req = Request(url = self.link, method='GET') req.add_header('Accept', '*/*') req.add_header('Charset', 'UTF-8') req.add_header('Connection', 'Keep-Alive') f = urlopen(req) # 跳过self.start_pos个字节,表明该线程只负责下载自己负责的那部分内容 for i in range(self.start_pos): f.read(1) # 读取网络数据,并写入本地 while self.length < self.current_part_size: data = f.read(1024) if data is None or len(data) <= 0: break self.current_part.write(data) # 累计该线程下载的总大小 self.length += len(data) self.current_part.close() f.close()#!/usr/bin/env python # -*- coding: utf-8 -*- # 文件名:thread_download-master.pyimport sysimport timefrom ThreadDownload import *def show_process(dl): while dl.get_complete_rate() < 1: complete_rate = int(dl.get_complete_rate()*100) print('\r' + '下载中···(已下载' + str(complete_rate) + '%)', end='', flush=True) time.sleep(0.01)def main(): try: Link = input('[+]' + 'Link: ') file_path = input('[+]' + 'File Path: ') thread_number = input('[+]' + 'Thread Number: ') thread_number = int(thread_number) dl = Download(Link, file_path, thread_number) dl.download() print('\n开始下载!') show_process(dl) print('\r' + '下载中···(已下载' + '100%)', end='', flush=True) print('\n下载完成!') except Exception: print('Parameter Setting Error') sys.exit(1)if __name__=='__main__': main()0x03 运行结果
下载歌曲《男孩》为例,下载到./Download/目录下并命名为男孩.mp3,设置5个线程:
下载成功:
到此这篇关于Python实现多线程下载脚本的示例代码的文章就介绍到这了,更多相关Python 多线程下载脚本内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文代码实现Python多线程扫描端口,具体实现代码如下。#coding:utf-8importsocketimportthreadimporttimesock
本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解。示例概述:下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法。要求开发一个程序实现如
本文实例讲述了PHP+shell实现多线程的方法。分享给大家供大家参考。具体如下:这里介绍如何借助shell脚本实现多线程。先写个简单的php代码,这里为了让脚
本文实例讲述了python基于queue和threading实现多线程下载的方法,分享给大家供大家参考。具体方法如下:主代码如下:#downloadworker
前面已经演示了Python:使用threading模块实现多线程编程二两种方式起线程和Python:使用threading模块实现多线程编程三threading