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中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
django如何连接已存在数据的数据库
Aug 14 Python
python语言元素知识点详解
May 15 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
解决echarts中饼图标签重叠的问题
May 16 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
Python logging模块原理解析及应用
Aug 13 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 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开发过程中常用函数收藏
2009/12/14 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
JS隐藏参数post传值实例
2013/04/18 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Python 多线程实例详解
2017/03/25 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
20行python代码实现人脸识别
2019/05/05 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
python实现简单学生信息管理系统
2020/04/09 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
生产车间标语
2014/06/11 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
公司停电通知
2015/04/15 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书