下半场ING,好吧,本来准备明天写的(拖延真快乐.gif),请然而,,,早上八点多跑公司加班(看书+学习)去,发现大门上挂着一把大锁,我只想说门禁是拿来看的嘛,加啥破锁o(╥﹏╥)o,严重打击了好员工的加班热情[○·`Д'·○],所以滚回来写博客了,忧伤,写了点代码还踩了半天坑(偷懒惹的祸),忧伤10086 ...


7.31号上午,也就是离职那天,机智的我突然想到,requests.get()下载文件实际是获取到的二进制内容然后写入到自己创建的文件中,以此来实现下载图片,文档,视频和等等,既然如此,那我直接打开已有的视频文件将新获取的二进制内容添加到后面,不就可以更直接的解决ts流合并的问题了嘛,机智如我,立刻进行了尝试,特意注意了文件打开和写入时的编码问题,果然搞定了,,,然后下午跑去签离职协议,完美收工。

运行环境:windows和linux(注意修改下路径),python36

代码如下:


# !/user/bin/env python
# -*- coding: utf-8 -*-
# au: caopeiya
# 201808011
import os, shutil
import urllib.request, urllib.error, requests # 打开并读取网页内容
def getUrlData(url):
try:
urlData = urllib.request.urlopen(url, timeout=20) # .read().decode('utf-8', 'ignore')
# urlData = requests.get(url, timeout=20) # .read().decode('utf-8', 'ignore')
return urlData
except Exception as err:
print(f'err getUrlData({url})\n', err)
return -1 # 下载文件-requests
def getDown_reqursts(url, file_path):
try:
header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}
response = requests.get(url, timeout=120, headers=header)
with open(file_path, mode='ab+') as f:
f.write(response.content)
# 下载文件较大时,使用循环下载
# with open(file_path, mode='wb') as f:
# for content in response.iter_content(1024):
# f.write(content)
print("down successful!")
except Exception as e:
print(e) def getVideo_requests(url_m3u8, path, videoName):
print('begin run ~~\n')
urlData = getUrlData(url_m3u8)
tempName_video = os.path.join(path, f'{videoName}.ts') # f'{}' 相当于'{}'.format() 或 '%s'%videoName
open(tempName_video, "wb").close() # 清空(顺带创建)tempName_video文件,防止中途停止,继续下载重复写入
# print(urlData)
for line in urlData:
# 解码decode("utf-8"),由于是直接使用了所抓取的链接内容,所以需要按行解码,如果提前解码则不能使用直接进行for循环,会报错
url_ts = str(line.decode("utf-8")).strip() # 重要:strip(),用来清除字符串前后存在的空格符和换行符
if not '.ts' in url_ts:
continue
else:
if not url_ts.startswith('http'): # 判断字符串是否以'http'开头,如果不是则说明url链接不完整,需要拼接
# 拼接ts流视频的url
url_ts = url_m3u8.replace(url_m3u8.split('/')[-1], url_ts)
print(url_ts)
getDown_reqursts(url=url_ts, file_path=tempName_video) # 下载视频流
filename = os.path.join(path, f'{videoName}.mp4')
shutil.move(tempName_video, filename)
print(f'Great, {videoName}.mp4 finish down!') if __name__ == '__main__':
url_m3u8 = 'http://wscdn.alhls.xiaoka.tv/201886/2f5/75a/HoHdTc1LjUaBjZbJ/index.m3u8'
path = r'D:\\'
videoName = url_m3u8.split('/')[-2]
getVideo_requests(url_m3u8, path, videoName)
# getDown_reqursts('http://wscdn.alhls.xiaoka.tv/201886/2f5/75a/HoHdTc1LjUaBjZbJ/147.ts', f'D:/videos/84.ts') ​

  

要注意以下几点:

1.用于解码(“utf-8”)进行解码,由于循环获取的每一行t都是是ASCII编码,必须解码为utf-8才能变为可识别的字符串;

2.用.strip()去除每一行的空格符和换行符,

Python3——根据m3u8下载视频(下)之requests的更多相关文章

  1. Python3 根据m3u8下载视频,批量下载ts文件并且合并

    Python3 根据m3u8下载视频,批量下载ts文件并且合并 m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少 ...

  2. Python3——根据m3u8下载视频(上)之urllib.request

    干活干活,区区懒癌已经阻挡不了澎湃的洪荒之力了...... 运行环境:Windows基于python3.6 ---------------------------------------------- ...

  3. Python 爬虫实例(13) 下载 m3u8 格式视频

    Python  requests  下载  m3u8 格式    视频 最近爬取一个视频网站,遇到  m3u8 格式的视频需要下载. 抓包分析,视频文件是多个  ts 文件,什么是 ts文件,请去百度 ...

  4. requests模块下载视频 显示进度和网速

    requests 下载视频 import os,time import requests def downloadFile(name, url): headers = {'Proxy-Connecti ...

  5. 根据M3U8地址下载视频

     下面展示的是通过M3U8地址,把这个地址转为一个视频文件:只是一个基本案例,当然,有些下载的M3U8文件里面格式是不一样的,还有的是加过密的,道理都是一个道理. import java.io.Buf ...

  6. win下youtube-dl 【ERROR: requested format not available】选下载视频质量的坑--【值得一看】

    需求说明(bug出处): 简单说:下载youtube的视频,嵌入翻译好的中文字幕. 详细说(可略过): 阿里的海外服务器需要布一个Web Service---用以接收国内(本地服务器)的请求, 然后用 ...

  7. 使用you-get下载视频网站视频或其他

    使用you-get下载视频网站视频或其他 文/玄魂 目录 使用you-get下载视频网站视频或其他 前言 1.1 下载.安装 依赖 exe安装 pip安装 Antigen安装 Git 克隆源码 Hom ...

  8. Python3 实现简易局域网视频聊天工具

    Python3 实现简易局域网视频聊天工具   1.环境 操作系统为 Ubuntu 16.04 python 3.5opencv-python 3.4.1.15numpy 1.14.5PyAudio ...

  9. 【python】M3U8下载器脚本

    [python]M3U8下载器脚本 脚本目标: 1. 输入M3U8文件的链接,得到视频 2.使用异步操作,这样可以快很多,不加锁,因为懒得写,而且影响不大 已知条件: 1.m3u8文件其实就是一个记录 ...

随机推荐

  1. layUI学习第一日:myeclipse中使用layUI

    第一步:下载layUI,网址:https://www.layui.com/ 第二步:查看layUI解压后的内容,和官网解释各个文件夹的内容 第三部:在myeclipse中新建一个web project ...

  2. 接口自动化与UI自动化两者的可行性

    1.首先接口测试是跳过前端界面对服务端的测试,UI测试是对前端界面的测试,从分层测试的角度考虑,两者不应该是可以互相取代的关系.   2.从公司开展自动化的的角度考虑,可以重点关注这个项目开展接口自动 ...

  3. 【oracle】DATE输出是什么东西

    SELECT TO_CHAR(SYSDATE) FROM DUAL;

  4. <Binary Search> 81 (高频)34 (很难hard, 高频)315 (hard)354

    81. Search in Rotated Sorted Array II 如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的.而如果可以有重复值,就会出现来面两种情 ...

  5. 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)

    题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...

  6. awk、sed、grep更适合的方向

    awk.sed.grep更适合的方向: grep 更适合单纯的查找或匹配文本 sed 更适合编辑匹配到的文本 awk 更适合格式化文本,对文本进行较复杂格式处理 关于awk内建变量个人见解,简单易懂 ...

  7. 移动端js触摸touch详解(附带案例源码)

    移动端触摸滑动原理详解案例,实现过程通过添加DOM标签的触摸事件监听,并计算触摸距离,通过距离坐标计算触摸角度,最后通过触摸角度去判断往哪个方向触摸的. 触摸的事件列表 触摸的4个事件: touchs ...

  8. RabbitMQ如何保证消息99.99%被发送成功?

    1. 本篇概要 RabbitMQ针对这个问题,提供了以下几个机制来解决: 生产者确认 持久化 手动Ack 本篇博客我们先讲解下生产者确认机制,剩余的机制后续单独写博客进行讲解. 2. 生产者确认 要想 ...

  9. oracle的instr()函数

    我们知道很多语言都提供了indexOf()和lastIndexOf()函数,以便能查找某个字符在某个字符串中的出现的位置和最后一次出现的位置. 但是Oracle没有提供这两个函数,事实上,它提供了一个 ...

  10. 给 VS2017、VS2019 安装 ILSpy 插件

    关于 ILSpy is the open-source .NET assembly browser and decompiler. ILSpy 主页地址:https://github.com/icsh ...