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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 Python
python中for语句简单遍历数据的方法
May 07 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
Python descriptor(描述符)的实现
Nov 15 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
python数字图像处理:图像的绘制
Jun 28 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
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
php header功能的使用
2013/10/28 PHP
php绘制一个矩形的方法
2015/01/24 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
如何利用Python 进行边缘检测
2020/10/14 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
信息专业本科生个人的自我评价
2013/10/28 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
学校实习推荐信
2015/03/27 职场文书
校长新学期寄语2016
2015/12/04 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers