0x01 分析
一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类:
Download类:包含download()
和get_complete_rate()
两种方法。
- download()方法种首先用 urlopen() 方法打开远程资源并通过 Content-Length获取资源的大小,然后计算每个线程应该下载网络资源的大小及对应部分吗,最后依次创建并启动多个线程来下载网络资源的指定部分。
- get_complete_rate()则是用来返回已下载的部分占全部资源大小的比例,用来回显进度。
ThreadDownload类:该线程类继承了threading.Thread类,包含了一个run()
方法。
run()方法主要负责每个线程读取网络数据并写入本地。
0x02 代码
# 文件名:ThreadDownload.py import threading from 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_size class 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.py import sys import time from 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个线程:
下载成功:
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月24日
2024年11月24日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]