python 多线程下载mp4_python多线程下载

#-*- coding=utf-8 -*-

importsysimportosimportos.pathimporttimeimporturllib.request, urllib.parse, urllib.errorfrom threading importThread

local_proxies={}classThreadDownComplete:def __init__(self, down_loaded):

self.down_loaded=down_loadedclassThreadDown(Thread, urllib.request.FancyURLopener):def __init__(self, thread_name, url, filename, ranges=0, proxies={}):

Thread.__init__(self, name=thread_name)

urllib.request.FancyURLopener.__init__(self, proxies)

self.name=thread_name

self.url=url

self.filename=filename

self.ranges=ranges

self.down_loaded=0

self.url_handler=None

self.one_time_size= 16384 #16kByte/time

self.data_start_point =self.ranges[0]

self.data_end_point= self.ranges[1]

self.down_start_time=int(time.time())

self.recent_down_time=int(time.time())

self.stop=False

self.complete=False

self.download_loan= self.data_end_point -self.data_start_pointtry:

self.down_loaded=os.path.getsize(self.filename)exceptOSError:

self.down_loaded=0

self.start_point= self.data_start_point +self.down_loadedif notself.complete_check():

self.data_check()defstart_reset(self):try:

os.remove(self.filename)except:passself.down_loaded=0

self.complete=False

self.stop=False

self.start_point=self.data_start_pointdefdata_check(self):if self.start_point >self.data_end_point:print("Part %s has been down_loaded over.\n" %self.filename)

self.start_reset()defflow_check(self):if self.down_loaded > self.download_loan + 1:

self.stop=FalsereturnFalsereturnTruedefcomplete_check(self):if self.down_loaded == self.download_loan + 1:

self.complete=True

self.stop=TruereturnTruereturnFalsedefdown(self):try:returnself.url_handler.read(self.one_time_size)except:return ''

def __run(self):print("task %s will down_load from %d to %d" %(self.name, self.start_point, self.data_end_point))

self.addheader("Range", "bytes=%d-%d" %(self.start_point, self.data_end_point))

self.url_handler=self.open(self.url)

data=self.down()while not self.stop and notself.complete:ifdata:

self.recent_down_time=int(time.time())

file_handler= open(self.filename, 'ab+')

file_handler.write(data)

file_handler.close()

self.down_loaded+=len(data)ifself.complete_check():break

if notself.flow_check():breakdata=self.down()defrun(self):ifself.complete:returnself.__run()

self.complete_check()while not self.stop and notself.complete:

self.start_reset()

self.__run()

self.complete_check()def get_file_size(url, proxies={}):

url_handler=urllib.request.urlopen(url)return int(url_handler.info()['Content-Length'])defsplit_blocks(total_size, block_number):

block_size= int(total_size /block_number)

ranges=[]for i in range(0, block_number - 1):

ranges.append((i* block_size, (i + 1) * block_size - 1))

ranges.append(((block_number- 1) * block_size, total_size - 1))returnrangesdefis_live(tasks):for index, task inenumerate(tasks):ifisinstance(task, ThreadDownComplete):continue

if int(time.time()) - task.recent_down_time > 8:

thread_name=task.name

filename=task.filename

ranges=task.ranges

url=task.url

task.stop=True

tasks[index]=start_down_thread(thread_name, url, filename, ranges)returnTrueiftask.complete:

tasks[index]=ThreadDownComplete(task.down_loaded)iftask.is_alive():returnTruereturnFalsedefstart_down_thread(thread_name, url, filename, ranges):

task=ThreadDown(thread_name, url, filename, ranges)

task.setDaemon(True)

task.start()returntaskdeflog(msg):

sys.stdout.write(msg)

sys.stdout.flush()def down_load(url, output, blocks=6, proxies=local_proxies):

down_file_size=get_file_size(url, proxies)

ranges=split_blocks(down_file_size, blocks)

thread_name= ["thread_%d" % i for i inrange(0, blocks)]

filename= [output + "_%d" % i for i inrange(0, blocks)]

tasks=[]for i inrange(0, blocks):

tasks.append(start_down_thread(thread_name[i], url, filename[i], ranges[i]))whileis_live(tasks):

down_loaded= sum([task.down_loaded for task intasks])

process= down_loaded / float(down_file_size) * 100log("\rfilesize:%d down_loaded:%d Completed:%.2f%%" %(down_file_size, down_loaded, process))

time.sleep(0.01)

file_handler= open(output, 'wb+')for i infilename:

f= open(i, 'rb')

file_handler.write(f.read())

f.close()try:

os.remove(i)pass

except:passfile_handler.close()if os.path.getsize(output) ==down_file_size:

log("\nCompleted\n")else:

log("\nError\n")

sys.exit(0)if __name__ == '__main__':

_url= "http://dldir1.qq.com/qqfile/qq/QQ7.9Light/14308/QQ7.9Light.exe"down_load(_url, os.path.basename(_url), blocks=30, proxies={})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用多线程来实现对MP4文件的下载。以下是一个使用多线程下载MP4文件的示例代码: ```python import requests import threading def download(url): r = requests.get(url, stream=True) file_name = url.split('/')[-1] with open(file_name, 'wb') as f: for chunk in r.iter_content(chunk_size=1024): if chunk: f.write(chunk) def multi_thread_download(url_list): threads = [] for url in url_list: t = threading.Thread(target=download, args=(url,)) threads.append(t) t.start() for t in threads: t.join() # 使用示例 url_list = ['http://example.com/file1.mp4', 'http://example.com/file2.mp4', 'http://example.com/file3.mp4'] multi_thread_download(url_list) ``` 上述代码中,首先定义了一个`download`函数,用于下载单个文件。然后定义了一个`multi_thread_download`函数,该函数接受一个URL列表作为参数,并使用多线程来同时下载这些文件。在`multi_thread_download`函数中,首先创建了一组线程,并分别将每个线程绑定到`download`函数上,并启动这些线程。最后,通过调用每个线程的`join`方法,等待所有线程都执行完毕。 请注意,在实际使用中,需要根据具体情况修改代码中的URL列表和文件保存路径。另外,还可以根据需要添加异常处理、进度显示等功能来完善下载过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python实现多线程并发下载大文件(断点续传支持)](https://blog.csdn.net/as604049322/article/details/119847193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python 实现多线程下载视频的代码](https://download.csdn.net/download/weixin_38519387/14915672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值