python 实现视频流下载保存MP4
# -*- coding:utf-8 -*-
import sys
import os
from glob import glob
import requests
reload(sys)
sys.setdefaultencoding("utf-8")
file_path=os.getcwd()
#获取需要转换的路径
def get_user_path(argv_dir):
if os.path.isdir(argv_dir):
return argv_dir
elif os.path.isabs(argv_dir):
return argv_dir
else:
return False
#对转换的TS文件进行排序
def get_sorted_ts(user_path):
ts_list = glob(os.path.join(user_path,'*.ts'))
boxer = []
for ts in ts_list:
if os.path.exists(ts):
# print(os.path.splitext(os.path.basename(ts)))
file,_ = os.path.splitext(os.path.basename(ts))
print file
boxer.append(file)
# boxer.append(int(file))
boxer.sort()
print(boxer)
return boxer
#文件合并
def convert_m3u8(file_path,boxer,o_file_name):
print u"开始拼接视频"
new_path=file_path+"/"+u"视频"
try:
os.chdir(new_path)
except Exception, e:
os.mkdir(new_path)
tmp = []
for ts in boxer:
print ts
tmp.append(str(ts)+'.ts')
cmd_str = '+'.join(tmp)
exec_str = "copy /b "+cmd_str+' '+o_file_name
print("copy /b "+cmd_str+' '+o_file_name)
os.chdir(user_path)
os.system(exec_str)
print "go home path"
import shutil
shutil.move(o_file_name,new_path+"/"+o_file_name)
os.chdir(file_path)
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(num,movie_url, _path):
os.chdir(_path)
print u'>>>[+] 第{}个视频 downloading...'.format(num)
print '-' * 60
error_get = []
for _url in movie_url:
# ts视频的名称
movie_name = _url.split('/')[-1][-6:]
movie_name1 = _url.split('_')[-1][-6:]
# print movie_name2
if len(str(movie_name1))<=4:
movie_name1="00"+str(movie_name1)
elif len(str(movie_name1))<=5:
movie_name1="0"+str(movie_name1)
else :
movie_name1=str(movie_name1)
try:
# 'Connection':'close' 防止请求端口占用
# timeout=30 防止请求时间超长连接
movie = requests.get(_url, headers = {'Connection':'close'}, timeout=60)
with open(movie_name1, 'wb') as movie_content:
movie_content.writelines(movie)
print u'>>>[+] 视频片段 ' + movie_name1 + u' 下载完成'
# 捕获异常,记录失败请求
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!!!'
url=["http://video.renrenjiang.cn/record/alilive/7684990805-1512186274.m3u8"]
if __name__ == '__main__':
try:
# _url = raw_input(unicode('>>>[+] 请输入指定的[.m3u8]目标URL。\n>>>[+] ').encode('gbk'))
# _path = raw_input(unicode('>>>[+] 请输入存储目标文件路径。\n>>>[+] ').encode('gbk'))
for i in range(len(url)):
_url=url[i]
_path=os.getcwd()+"/"+"ts"+str(i+5)
try:
os.chdir(_path)
except Exception, e:
os.mkdir(_path)
storage_path = check_path(_path)
movie_url = get_url(_url, storage_path)
download_movie(i+1,movie_url, storage_path)#下载视频
user_path =_path
o_file_name=str(i+5)+".mp4"
boxer = get_sorted_ts(user_path)
convert_m3u8(file_path,boxer,o_file_name)#拼接视频
except Exception as e:
print e
python 实现视频流下载保存MP4的更多相关文章
- python爬虫脚本下载YouTube视频
python爬虫脚本下载YouTube视频 爬虫 python YouTube视频 工作环境: python 2.7.13 pip lxml, 安装 pip install lxml,主要用xpath ...
- You-Get 视频下载工具 Python命令行下载工具
You-Get 是一个命令行工具, 用来下载各大视频网站的视频, 是我目前知道的命令行下载工具中最好的一个, 之前使用过 youtube-dl, 但是 youtube-dl 吧, 下载好的视频是分段的 ...
- 【python】M3U8下载器脚本
[python]M3U8下载器脚本 脚本目标: 1. 输入M3U8文件的链接,得到视频 2.使用异步操作,这样可以快很多,不加锁,因为懒得写,而且影响不大 已知条件: 1.m3u8文件其实就是一个记录 ...
- Js 直接下载保存文件
//直接下载保存文件 function Download(filePath) { // 如果中间IFRAME不存在,则添加 if (!document.getElementById("_SA ...
- python模拟Get请求保存网易歌曲的url
python模拟Get请求保存网易歌曲的url 作者:vpoet mail:vpoet_sir@163.com 日期:大约在夏季 #coding:utf-8 import requests impor ...
- 使用python网络库下载
下载1000次网页资源 1,普通循环方式下载1000次,非常慢 #!/usr/bin/python # -*- coding: utf-8 -*- import sys import os impor ...
- Extjs 上传文件 IE不兼容的问题[提示下载保存]
我最不喜欢的浏览器的是IE,但无奈很多项目的客户使用的是IE. 在使用Extjs做文件上传时,其他浏览器没有问题,但IE却一个劲提示保存文件,看服务端运行,它其实是运行成功了已经,但客户端的进度条却一 ...
- 20180903 - Python Pip 工具下载whl包与离线安装
20180903 - Python Pip 工具下载whl包与离线安装 1. 我的Blog 博客园 https://www.cnblogs.com/piggybaba 个人网站 http://pigg ...
- python爬虫之下载文件的方式总结以及程序实例
python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...
- Python Extension Packages 下载
Python Extension Packages下载 这个下载源资源丰富,python支持版本从2.x到3.7,从win32到win64位都有支持,是非常好资源. 特别留下记号备查. Index b ...
随机推荐
- noi 1.5 42画矩形
noi 1.5 42画矩形 1.描述 根据参数,画出矩形. 2.输入 输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列):第三个参数是 ...
- Nginx负载均衡4种方案
1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器. 配置的例子如下:http{ upstream sampleapp { ...
- 【情景题】NPDP经典题目(下)
1.员工Mary是ACE电气公司的产品经理,公司高管要求她准备一份评价标准清单,从而以该清单为基础来对该产品组合中的新机会进行评价.她提交的清单如下:-潜在市场份额-对公司获利能力的潜在贡献-产品开发 ...
- IT部门一线主管要如何才能对员工的某项工作的时间和难度评估心里有数?
自己去处理一些棘手的问题,并趁此机会了解系统的逻辑,评估复杂度,是复杂度,不是具体的内容,然后把这个印象记住. 定一个需求,请员工去做,看看完成到底需要多久,在做的过程中或者做完之后,跟他讨论实现的过 ...
- 让你深夜emo的“网抑云”,是如何做产品设计的?
网易云音乐作为国内首个以"歌单"为核心架构的音乐APP,有的人喜欢它的热评,有的人却觉得它的版权太少,虽然网易云音乐不是曲库最丰富的听歌软件,但绝对是听歌软件里情感体验最好的. 我 ...
- C# Linq将DataTable中的某列转换成数组或者List
// 获取到的数据 DataTable picDt = GetPdmPoroductModelPictureData(productModelCode); // 将productCode列转数组 st ...
- 移动端性能测试--CPU资源
一.背景 在很多场景下我们去使用 App,可能会碰到手机会出现发热发烫的现象.这是因为 CPU 使用率过高.CPU 过于繁忙,会使得整个系统无法响应用户,整体性能降低,用户体验变得相当差,也容易引起 ...
- Ubuntu: 升级或安装最新版本的 Nginx
Ubuntu 默认 apt 源中的 Nginx 版本比较旧,今天介绍下如何在 Ubuntu 中安装最新版本的 Nginx. 要安装较新版本的 Nginx, 可以使用 Nginx 的 APT 源.执行如 ...
- Git 工作常用操作
撤回commit 上一次提交的代码 git reset --soft HEAD^ HEAD^的意思是上一个版本,也可以写成HEAD~1 如果你进行了2次commit,想都撤回,可以使用HEAD~2 g ...
- ORACLE 查看用户下表占用空间大小
方式一: select * from user_segments s where s.BYTES is not null order by s.BYTES desc 方式二: select s ...