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 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
简单介绍Python中的len()函数的使用
Apr 07 Python
Python psutil模块简单使用实例
Apr 28 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
Python实现的凯撒密码算法示例
Apr 12 Python
解决python 无法加载downsample模型的问题
Oct 25 Python
Python编程中flask的简介与简单使用
Dec 28 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Python requests设置代理的方法步骤
Feb 23 Python
Django models文件模型变更错误解决
May 11 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 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
56.com视频采集接口程序(PHP)
2007/09/22 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
Javascript 解疑
2009/11/11 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
使用python统计文件行数示例分享
2014/02/21 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
银行行长竞聘演讲稿
2014/04/23 职场文书
民间个人借款协议书
2014/09/30 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
监护人证明
2015/06/19 职场文书
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL