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 快速排序代码
Nov 23 Python
python通过pil模块获得图片exif信息的方法
Mar 16 Python
详解django中自定义标签和过滤器
Jul 03 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
详解Python中where()函数的用法
Mar 27 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
python得到windows自启动列表的方法
Oct 14 Python
解决python Markdown模块乱码的问题
Feb 14 Python
python GUI实现小球满屏乱跑效果
May 09 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
PHP 采集程序原理分析篇
2010/03/05 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
最短的IE判断代码
2011/03/13 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
python爬虫headers设置后无效的解决方法
2017/10/21 Python
python实现NB-IoT模块远程控制
2018/06/20 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
python3.7 sys模块的具体使用
2019/07/22 Python
pytorch数据预处理错误的解决
2020/02/20 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
协会周年庆活动方案
2014/08/26 职场文书
教师自我剖析材料
2014/09/29 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL