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 time模块用法实例详解
Sep 11 Python
Python的装饰器用法学习笔记
Jun 24 Python
详解python3百度指数抓取实例
Dec 12 Python
python验证码识别的示例代码
Sep 21 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
PyQt5每天必学之组合框
Apr 20 Python
python对html过滤处理的方法
Oct 21 Python
用Python实现数据的透视表的方法
Nov 16 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
PHP垃圾回收机制简单说明
2010/07/22 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
js资料prototype 属性
2007/03/13 Javascript
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
angular动态表单制作
2018/02/23 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
Python subprocess模块学习总结
2014/03/13 Python
Python3匿名函数用法示例
2018/07/25 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
2019史上最全Database工程师题库
2015/12/06 面试题
店长助理岗位职责
2013/12/13 职场文书
中国央视网签名寄语
2014/01/18 职场文书
班级体育活动总结
2014/07/05 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
清洁员岗位职责
2015/02/15 职场文书
小学教师读书笔记
2015/07/01 职场文书
2016年感恩节寄语
2015/12/07 职场文书
Python echarts实现数据可视化实例详解
2022/03/03 Python