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计算最大优先级队列实例
Dec 18 Python
Python的垃圾回收机制深入分析
Jul 16 Python
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
python监控文件或目录变化
Jun 07 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
判断网页编码的方法python版
Aug 12 Python
python僵尸进程产生的原因
Jul 21 Python
深入理解Django的中间件middleware
Mar 14 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
Python单元和文档测试实例详解
Apr 11 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 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原理的opcodes(操作码)
2010/10/26 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
项目经理岗位职责
2013/11/11 职场文书
合同协议书格式
2014/04/18 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
药店促销活动总结
2014/07/10 职场文书
离婚协议书范文2015
2015/01/26 职场文书
从事会计工作年限证明
2015/06/23 职场文书
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript