python 实现多线程下载视频的代码
代码:
defthread(url):
r=requests.get(url,headers=None,stream=True,timeout=30)
#print(r.status_code,r.headers)
headers={}
all_thread=1
#获取视频大小
file_size=int(r.headers['content-length'])
#如果获取到文件大小,创建一个和需要下载文件一样大小的文件
iffile_size:
fp=open('2.mp4','wb')
fp.truncate(file_size)
print('视频大小:'+str(int(file_size/1024/1024))+"MB")
fp.close()
#每个线程每次下载大小为5M
size=5242880
#当前文件大小需大于5M
iffile_size>size:
#获取总线程数
all_thread=int(file_size/size)
#设最大线程数为10,如总线程数大于10
#线程数为10
ifall_thread>10:
all_thread=10
part=file_size//all_thread
threads=[]
starttime=datetime.datetime.now().replace(microsecond=0)
foriinrange(all_thread):
#获取每个线程开始时的文件位置
start=part*i
#获取每个文件结束位置
ifi==all_thread-1:
end=file_size
else:
end=start+part
ifi>0:
start+=1
headers=headers.copy()
headers['Range']="bytes=%s-%s"%(start,end)
t=threading.Thread(target=Handler,name='th-'+str(i),
kwargs={'start':start,'end':end,'url':url,'filename':'2.mp4','headers':headers})
t.setDaemon(True)
threads.append(t)
#线程开始
fortinthreads:
time.sleep(0.2)
t.start()
#等待所有线程结束
fortinthreads:
t.join()
endtime=datetime.datetime.now().replace(microsecond=0)
print('用时:%s'%(endtime-starttime))
defHandler(start,end,url,filename,headers={}):
tt_name=threading.current_thread().getName()
print(tt_name+'isbegin')
r=requests.get(url,headers=headers,stream=True)
total_size=end-start
downsize=0
startTime=time.time()
withopen(filename,'r+b')asfp:
fp.seek(start)
var=fp.tell()
forchunkinr.iter_content(204800):
ifchunk:
fp.write(chunk)
downsize+=len(chunk)
line=tt_name+'-downloading%dKB/s-%.2fMB,共%.2fMB'
line=line%(
downsize/1024/(time.time()-startTime),downsize/1024/1024,
total_size/1024/1024)
print(line,end='\r')
if__name__=='__main__':
url=input('输入视频链接(请输入视频原链):')
thread(url)
效果:
可以看见,38MB,一秒下完。
唯一的缺点就是,要有视频原链,而一般这个视频原链都是不会轻易被找到的,这就叫反爬。
找视频原链,就找爬虫,视频爬虫只是爬虫的一种。
可以根据视频大小,改变线程数。
总结
以上所述是小编给大家介绍的python实现多线程下载视频的代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。