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小技巧之批量抓取美女图片
Jun 06 Python
Python开发的单词频率统计工具wordsworth使用方法
Jun 25 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Linux下python3.7.0安装教程
Jul 30 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 Python
python实现会员管理系统
Mar 18 Python
python中redis包操作数据库的教程
Apr 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
繁体中文转换为简体中文的PHP函数
2006/10/09 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
PyQt 线程类 QThread使用详解
2017/07/16 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
详解Python中的四种队列
2018/05/21 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
哈弗商学院毕业生求职信
2014/02/26 职场文书
法人委托书范本
2014/04/04 职场文书
增员口号大全
2014/06/18 职场文书
收款授权委托书
2014/10/02 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
中层干部考核评语
2015/01/04 职场文书
病假条格式范文
2015/08/17 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书