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使用循环实现批量创建文件夹示例
Mar 25 Python
python判断windows系统是32位还是64位的方法
May 11 Python
python中sys.argv参数用法实例分析
May 20 Python
python中异常报错处理方法汇总
Nov 20 Python
Python 多线程Threading初学教程
Aug 22 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
python实现简单神经网络算法
Mar 10 Python
Python中存取文件的4种不同操作
Jul 02 Python
pyinstaller还原python代码过程图解
Jan 08 Python
python中if及if-else如何使用
Jun 02 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
Python Pygame实现俄罗斯方块
Feb 19 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
Apache设置虚拟WEB
2006/10/09 PHP
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
Python 列表(List)操作方法详解
2014/03/11 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
活动倡议书范文
2014/05/13 职场文书
大连星海广场导游词
2015/02/10 职场文书
离职证明格式样本
2015/06/12 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
施工安全协议书
2016/03/22 职场文书