python爬取m3u8连接的视频


Posted in Python onFebruary 28, 2018

本文为大家分享了python爬取m3u8连接的视频方法,供大家参考,具体内容如下

要求:输入m3u8所在url,且ts视频与其在同一路径下

#!/usr/bin/env/python
#_*_coding:utf-8_*_
#Data:17-10-08
#Auther:苏莫
#Link:http://blog.csdn.net/lingluofengzang
#PythonVersion:python2.7
#filename:download_movie.py

import os
import sys
import requests

reload(sys)
sys.setdefaultencoding('utf-8')

# 功能:爬取m3u8格式的视频

# 检查存储路径是否正常
def check_path(_path):
  # 判断存储路径是否存在
  if os.path.isdir(_path) or os.path.isabs(_path):
    # 判断存储路径是否为空
    if not os.listdir(_path):
      return _path

    else:

      print u'>>>[-] 目标文件不为空,将清空目标文件,是否更换路径?'
      flag = raw_input('>>>[*] Yes:1 No:2 \n>>>[+] [2]')

      try:
        if flag == '1':
          _path = raw_input(unicode('>>>[+] 请输入目标文件路径。\n>>>[+] ').encode('gbk'))
          check_path(_path)
        else:
          # 清空存储路径
          os.system('rd /S /Q ' + _path)
          os.system('mkdir ' + _path)
          return _path
      except Exception as e:
        print e
        exit(0)

  else:
    os.makedirs(_path)
    return _path

# 获取ts视频的爬取位置
def get_url(_url, _path):

  all_url = _url.split('/')
  url_pre = '/'.join(all_url[:-1]) + '/'
  url_next = all_url[-1]

  os.chdir(_path)
  # 获取m3u8文件
  m3u8_txt = requests.get(_url, headers = {'Connection':'close'})
  with open(url_next, 'wb') as m3u8_content:
    m3u8_content.write(m3u8_txt.content)
  # 提取ts视频的url
  movies_url = []
  _urls = open(url_next, 'rb')
  for line in _urls.readlines():
    if '.ts' in line:
      movies_url.append(url_pre + line[:-1])
    else:
      continue

  _urls.close()
  return movies_url

# 爬取ts视频
def download_movie(movie_url, _path):
  os.chdir(_path)
  print '>>>[+] downloading...'
  print '-' * 60
  error_get = []

  for _url in movie_url:
    # ts视频的名称
    movie_name = _url.split('/')[-1][-6:]

    try:
      # 'Connection':'close' 防止请求端口占用
      # timeout=30  防止请求时间超长连接
      movie = requests.get(_url, headers = {'Connection':'close'}, timeout=60)
      with open(movie_name, 'wb') as movie_content:
        movie_content.writelines(movie)
      print '>>>[+] File ' + movie_name + ' done'
    # 捕获异常,记录失败请求
    except:
      error_get.append(_url)
      continue
  # 如果没有不成功的请求就结束
  if error_get:
    print u'共有%d个请求失败' % len(file_list)
    print '-' * 60
    download_movie(error_get, _path)
  else:
    print '>>>[+] Download successfully!!!'

if __name__ == '__main__':
  try:

    _url = raw_input(unicode('>>>[+] 请输入指定的[.m3u8]目标URL。\n>>>[+] ').encode('gbk'))
    _path = raw_input(unicode('>>>[+] 请输入存储目标文件路径。\n>>>[+] ').encode('gbk'))

    storage_path = check_path(_path)
    movie_url = get_url(_url, storage_path)
    download_movie(movie_url, storage_path)

  except Exception as e:
    print e

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
解决python爬虫中有中文的url问题
May 11 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
Django实现发送邮件找回密码功能
Aug 12 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
Python os模块常用方法和属性总结
Feb 20 Python
关于多元线性回归分析——Python&SPSS
Feb 24 Python
Python Django view 两种return的实现方式
Mar 16 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 #Python
浅谈Python中的私有变量
Feb 28 #Python
python中logging包的使用总结
Feb 28 #Python
深入理解Python爬虫代理池服务
Feb 28 #Python
python实现装饰器、描述符
Feb 28 #Python
python安装教程
Feb 28 #Python
深入理解Python 关于supper 的 用法和原理
Feb 28 #Python
You might like
php 安全过滤函数代码
2011/05/07 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
动态加载iframe
2006/06/16 Javascript
js可突破windows弹退效果代码
2008/08/09 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
js动态引入的四种方法
2018/05/05 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
python之import机制详解
2014/07/03 Python
简单介绍Python中的len()函数的使用
2015/04/07 Python
python中__call__内置函数用法实例
2015/06/04 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
python机器学习之神经网络实现
2018/10/13 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
天网工程实施方案
2014/03/26 职场文书
财务人员担保书
2014/05/13 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
面试感谢信范文
2015/01/22 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL