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读写ini文件的方法
May 28 Python
Python实现比较两个列表(list)范围
Jun 12 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
Python logging模块用法示例
Aug 28 Python
python求平均数、方差、中位数的例子
Aug 22 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
python 制作一个gui界面的翻译工具
May 14 Python
只用50行Python代码爬取网络美女高清图片
Jun 02 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打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
js静态作用域的功能。
2006/12/25 Javascript
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
基于vue实现分页效果
2017/11/06 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
深入讲解Java编程中类的生命周期
2016/02/05 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python中scikit-learn机器代码实例
2018/08/05 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
电子技术专业中专生的自我评价
2013/12/17 职场文书
人事部专员岗位职责
2014/03/04 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
司机岗位职责
2015/02/04 职场文书
道歉的话语大全
2015/05/12 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
详解Laravel服务容器的优势
2021/05/29 PHP
python中redis包操作数据库的教程
2022/04/19 Python