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实现中一次读取多个值的方法
Apr 22 Python
Python实现端口检测的方法
Jul 24 Python
详解Python下载图片并保存本地的两种方式
May 15 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
用Python画小女孩放风筝的示例
Nov 23 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Python中Selenium对Cookie的操作方法
Jul 09 Python
Python中可变和不可变对象的深入讲解
Aug 02 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
php 结果集的分页实现代码
2009/03/10 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
Python中super关键字用法实例分析
2015/05/28 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
详解python中的lambda与sorted函数
2020/09/04 Python
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
群众路线剖析材料
2014/02/02 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
Java实现简单小画板
2022/06/10 Java/Android