下半场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. (转)SpringMVC表单多对象传递小技巧——@InitBinder

    转:https://www.jianshu.com/p/59771cbf373d 1.问题情景 项目中前端后台的数据传递是必不可少的,比如说我们要在一张表单中提交对象,如果只是一个对象就就很好做,因为 ...

  2. 好用的代码统计小工具SourceCounter(下载)

    SourceCounter下载链接 https://pan.baidu.com/s/12Cg51L0hRn5w-m1NQJ-Xlg 提取码:i1cd 很多时候我们需要统计自己所写的代码的数量.举个栗子 ...

  3. destoon模块绑定二级域名出现 File not found解决办法

    昨天晚上帮一个朋友给我说他绑定模块二级域名出现 File not found,所以今天分享关于解决办法. 模块启用二级域名后,首页打开正常,但是点内容页和列表页出现File not found. 解决 ...

  4. thinkphp6报错Driver [Think] not supported.

    解决方法 composer require topthink/think-view

  5. go tcp通信

    ----tcp 客户端 package main import ( "net" "fmt" ) func main() { conn,err := net.Di ...

  6. ESA2GJK1DH1K升级篇: 阿里云物联网平台 OTA: 关于阿里云物联网平台 OTA 的升级流程

    前言 鉴于有些用户直接想使用现成的物联网平台实现 OTA 远程升级 我就写一写这系列的文章 注意:首先大家必须把我自建服务器是如何实现的看明白! 我看了下阿里云提供的,实际上流程和咱自建实现的差别不大 ...

  7. 和神仙ob的对话

  8. Paper | Recovering Realistic Texture in Image Super-resolution by Deep Spatial Feature Transform

    目录 故事背景 空域特征转换 超分辨率网络 发表在2018年CVPR. 摘要 Despite that convolutional neural networks (CNN) have recentl ...

  9. python-1-基础认识

    前言 将近2020年,python2即将不再更新,但是我们现在的python3也能非常受欢迎的!回顾一下2/3的区别: 1.python2 源码不标准,混乱,重复代码太多, 2.python3 统一 ...

  10. Spring源码系列 — Resource抽象

    前言 前面两篇介绍了上下文的启动流程和Environemnt的初始化,这两部分都是属于上下文自身属性的初始化.这篇开始进入Spring如何加载实例化Bean的部分 - 资源抽象与加载. 本文主要从以下 ...