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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。