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 11 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
Python 使用类写装饰器的小技巧
Sep 30 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
Python通用函数实现数组计算的方法
Jun 13 Python
Python装饰器的应用场景代码总结
Apr 10 Python
基于CentOS搭建Python Django环境过程解析
Aug 24 Python
python压包的概念及实例详解
Feb 17 Python
python百行代码实现汉服圈图片爬取
Nov 23 Python
Django中celery的使用项目实例
Jul 07 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
第三节--定义一个类
2006/11/16 PHP
php fckeditor 调用的函数
2009/06/21 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
php类的定义与继承用法实例
2015/07/07 PHP
php设计模式之委托模式
2016/02/13 PHP
PHP框架性能测试报告
2016/05/08 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
JS异步错误捕获的一些事小结
2019/04/26 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
优秀企业获奖感言
2014/02/01 职场文书
小学生植树节活动总结
2014/07/04 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
部门2015年度工作总结
2015/04/29 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技