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之编写类之一创建实例
Oct 11 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
Python用GET方法上传文件
Mar 10 Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
Python访问MongoDB,并且转换成Dataframe的方法
Oct 15 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
Oct 23 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
学习Python需要哪些工具
Sep 04 Python
cookies应对python反爬虫知识点详解
Nov 25 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
我的论坛源代码(五)
2006/10/09 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
smarty中js的调用方法示例
2014/10/27 PHP
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
Python中自定义函数的教程
2015/04/27 Python
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
Python端口扫描简单程序
2016/11/10 Python
python函数与方法的区别总结
2019/06/23 Python
基于Python的OCR实现示例
2020/04/03 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
HEMA法国:荷兰原创设计
2019/02/21 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
大学生怎样进行自我评价
2013/12/07 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
春季运动会开幕词
2015/01/28 职场文书
2019个人半年工作总结
2019/06/21 职场文书
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
python中tkinter复选框使用操作
2021/11/11 Python