python 实现多线程下载视频的代码


Posted in Python onNovember 15, 2019

代码:

def thread(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'])
  # 如果获取到文件大小,创建一个和需要下载文件一样大小的文件
  if file_size:
    fp = open('2.mp4', 'wb')
    fp.truncate(file_size)
    print('视频大小:' + str(int(file_size / 1024 / 1024)) + "MB")
    fp.close()
  # 每个线程每次下载大小为5M
  size = 5242880
  # 当前文件大小需大于5M
  if file_size > size:
    # 获取总线程数
    all_thread = int(file_size / size)
    # 设最大线程数为10,如总线程数大于10
    # 线程数为10
    if all_thread > 10:
      all_thread = 10
  part = file_size // all_thread
  threads = []
  starttime = datetime.datetime.now().replace(microsecond=0)
  for i in range(all_thread):
    # 获取每个线程开始时的文件位置
    start = part * i
    # 获取每个文件结束位置
    if i == all_thread - 1:
      end = file_size
    else:
      end = start + part
    if i > 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)
  # 线程开始
  for t in threads:
    time.sleep(0.2)
    t.start()
  # 等待所有线程结束
  for t in threads:
    t.join()
  endtime = datetime.datetime.now().replace(microsecond=0)
  print('用时:%s' % (endtime - starttime))
def Handler(start, end, url, filename, headers={}):
  tt_name = threading.current_thread().getName()
  print(tt_name + ' is begin')
  r = requests.get(url, headers=headers, stream=True)
  total_size = end - start
  downsize = 0
  startTime = time.time()
  with open(filename, 'r+b') as fp:
    fp.seek(start)
    var = fp.tell()
    for chunk in r.iter_content(204800):
      if chunk:
        fp.write(chunk)
        downsize += len(chunk)
        line = tt_name + '-downloading %d KB/s - %.2f MB, 共 %.2f MB'
        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)

效果:

python 实现多线程下载视频的代码

可以看见,38MB,一秒下完。

唯一的缺点就是,要有视频原链,而一般这个视频原链都是不会轻易被找到的,这就叫反爬。

找视频原链,就找爬虫,视频爬虫只是爬虫的一种。

可以根据视频大小,改变线程数。

总结

以上所述是小编给大家介绍的python 实现多线程下载视频的代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python中3种内建数据结构:列表、元组和字典
Nov 30 Python
初步剖析C语言编程中的结构体
Jan 16 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
python学习之hook钩子的原理和使用
Oct 25 Python
Python设计模式之策略模式实例详解
Jan 21 Python
Python基本socket通信控制操作示例
Jan 30 Python
Python 中判断列表是否为空的方法
Nov 24 Python
Python实现钉钉订阅消息功能
Jan 14 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
Jun 30 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
Oct 21 Python
python RSA加密的示例
Dec 09 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 #Python
浅析python内置模块collections
Nov 15 #Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 #Python
Python numpy数组转置与轴变换
Nov 15 #Python
python修改文件内容的3种方法详解
Nov 15 #Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 #Python
python根据文本生成词云图代码实例
Nov 15 #Python
You might like
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
2015/04/12 Javascript
DOM 高级编程
2015/05/06 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
js实现移动端轮播图
2020/12/21 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
什么是反射
2012/03/17 面试题
学前教育教师求职自荐信
2013/09/22 职场文书
会计专业毕业生自荐信范文
2013/12/20 职场文书
体育专业学生自我评价范文
2014/01/17 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
校园安全广播稿范文
2014/09/25 职场文书
2015年市场部工作总结
2015/04/30 职场文书
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle