干活干活,区区懒癌已经阻挡不了澎湃的洪荒之力了......

运行环境:Windows基于python3.6

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------

抓取视频时遇到M3U8的确挺烦人的,去年年底实习,由于项目需求所以和一个同事主攻蟒蛇爬虫,抓取含有清晰人脸的图片和视频,在爬取一些视频网站和直播网站时就被“它”糊了一脸,作为一只,呃,不对,是两只刚入爬虫坑的菜鸟,在视频加载播放时找不到啥关于的.mp4,.MKV的链接,反而出现不少.ts的链接,然后爬取找度娘,重点如下:

M3U8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的TS格式的视频文件,然后存在服务器中(现在为了减少I / O访问次数,一般存在服务器的内存中),通过M3U8解析出来路径,然后去请求,是现在比较流行的一种加载方式,诸如腾讯视频之类大多都是切割成TS流进行加载。

但当时还是晕,理论和实际处理是两回事,那时候关于如何爬取M3U8的博客不是很多而且很少说到重点(给俺下载代码,理论改天再补)样么是其它语言写的更懵,近来倒是越来越多了(可惜当时没赶上),最后找到篇关于下载的却发现是python2的代码,因为那时候刚开始使用蟒之前学的是Java中,所以调了好一会还是运行失败,但是也收获了不少,之后和同事研究了两天试验了几个方案最终确定采用边下边合的方式进行处理,上个月底从公司离职了,由于公司管理较为严格禁止向外网(公司局域网以外)发送消息或拷贝文件,(嗯,拍照也不行,就似〜这么严)所以这几天晚上下班回来抽空写写改改又另起了炉灶,代码如下,随意写的所以异常处理和模拟浏览器啥的就没加了(懒)!

注:仅限窗口下使用,如果要在Linux的上使用需要修改合并命令,嗯,或者等几天我再来篇兼容的


# !/user/bin/env python
# -*- coding: utf-8 -*-
# au: caopeiya
# 20180808
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')
return urlData
except Exception as err:
print(f'err getUrlData({url})\n', err)
return -1 # 下载文件-urllib.request
def getDown_urllib(url, file_path):
try:
urllib.request.urlretrieve(url, filename=file_path)
return True
except urllib.error.URLError as e:
# hasttr(e, 'code'),判断e 是否有.code属性,因为不确定是不是HTTPError错误,URLError包含HTTPError,但是HTTPError以外的错误是不返回错误码(状态码)的
if hasattr(e, 'code'):
print(e.code) # 打印服务器返回的错误码(状态码),如403,404,501之类的
elif hasattr(e, 'reason'):
print(e.reason) # 打印错误原因 def getVideo_urllib(url_m3u8, path, videoName):
print('begin run ~~\n')
# urlData = getUrlData(url_m3u8).readlines()
urlData = getUrlData(url_m3u8)
num = 0
tempName_video = os.path.join(path, f'{videoName}.ts') # f'{}' 相当于'{}'.format() 或 '%s'%videoName
# print(urlData)
for line in urlData:
# 解码,由于是直接使用了所抓取的链接内容,所以需要按行解码,如果提前解码则不能使用直接进行for循环,会报错
# 改用上面的readlines()或readline()也可以,但更繁琐些,同样需要按行解码,效率更低
url_ts = line.decode('utf-8')
tempName_ts = os.path.join(path, f'{num}.ts') # f'{}' 相当于'{}'.format()
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_urllib(url_ts, tempName_ts) # 下载视频流
if num == 0:
# 重命名,已存在则自动覆盖
shutil.move(tempName_ts, tempName_video)
num += 1
continue
cmd = f'copy /b {tempName_video}+{tempName_ts} {tempName_video}'
res = os.system(cmd)
if res == 0:
os.system(f'del {tempName_ts}')
if num == 20: # 限制下载的ts流个数,这个视频挺长有四百多个.ts文件,所以限制一下
break
num += 1
continue
print(f'Wrong, copy {num}.ts-->{videoName}.ts failure')
return False
os.system(f'del {path}/*.ts') # 调用windows命令行(即cmd)工具,运行命令
filename = os.path.join(path, f'{videoName}.mp4')
shutil.move(tempName_video, filename)
print(f'{videoName}.mp4 finish down!') if __name__ == '__main__':
url_m3u8 = 'http://wscdn.alhls.xiaoka.tv/201886/2f5/75a/HoHdTc1LjUaBjZbJ/index.m3u8'
path = r'D:\videos'
videoName = url_m3u8.split('/')[-2]
getVideo_urllib(url_m3u8, path, videoName) ​

  

注:修改文件名时,特意选择shutil模块(可以看作操作系统的高级版)的移动方法,虽然移动主要是用来移动文件的,重命名算是附带的,不过强制覆盖的特点在这里很有用,避免中断后重新下载时重命名产生异常。

PS:说来有趣,7月31号,也就是离职的那天上午,灵感突显,利用请求下载文件的写入特点,彻底解决了调用命令行导致的不兼容的窗口以外环境的问题,哈哈,所以下一篇就它了。

Python3——根据m3u8下载视频(上)之urllib.request的更多相关文章

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

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

  2. Python3——根据m3u8下载视频(下)之requests

    下半场ING,好吧,本来准备明天写的(拖延真快乐.gif),请然而,,,早上八点多跑公司加班(看书+学习)去,发现大门上挂着一把大锁,我只想说门禁是拿来看的嘛,加啥破锁o(╥﹏╥)o,严重打击了好员工 ...

  3. python3爬虫初探(一)之urllib.request

    ---恢复内容开始--- #小白一个,在此写下自己的python爬虫初步的知识.如有错误,希望谅解并指出. #欢迎和大家交流python爬虫相关的问题 #2016/6/18 #----第一把武器--- ...

  4. 老司机教你下载tumblr上视频和图片的正确姿势

    本文面向初学者. 很多同学问我:“我非常想学Python编程,但是找不到兴趣点”. 还有的同学呢,找到了很好的兴趣点,但是无从下手,“玄魂老师,我想下载tumblr上的视频, 怎么下载,Python能 ...

  5. 在Windows上安装FFmpeg程序的方法(you-get下载视频必备程序)

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序 ...

  6. 如何下载网页上的视频和flash的方法

    下面介绍一种下载视频的简便方法,这种方法不需要安装任何下载软件,而且适合所有 FLV(Flash Video)格式的视频文件. 第一步 清空Temporary Internet Files(临时网络文 ...

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

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

  8. 如何使用python下载网站上的视频

    youtube-dl 从名字上也能看出来,是专门用来下载YouTube的视频. 不过本人对YouTube不感兴趣,但是这个模块可以用来下载bilibili上的视频我们就来试一试 首先pip insta ...

  9. 如何下载Youtube上的视频, 字幕, MP3等资源, 方法简单直接!

    Youtube不用多说了吧,秒杀国内一众视频平台,没有之一, 既然关注Youtube说明大家对Youtube都是认同的.不用说4K,8K视频,比起国内一些伪4K, 真的良心, 就连广告也是5秒跳过, ...

随机推荐

  1. Prometheus学习系列(四)之Prometheus 配置说明

    前言 本文来自Prometheus官网手册 和 Prometheus简介 说明 Prometheus通过命令行和配置文件进行配置,命令行配置不能修改的系统参数(例如存储位置,要保留在磁盘和内存中的数据 ...

  2. 1.Ansible自动化管理工具

    1.Ansible基本概述 Ansible是一个IT自动化的配置管理工具,自动化主要体现在Ansible集成了丰富模块,丰富的功能组件, 可以通过一个命令行完成一系列的操作.进而能减少我们重复性的工作 ...

  3. EF实体类指定部分属性不映射成数据库字段特性

    添加NotMapped 特性 /// <summary> /// 用户名 /// </summary> [NotMapped] public string user_name ...

  4. [css flex布局]实例一,本来还想挺简单的,弄了挺久呢,先写一部分

    全是代码,直接拷走吧,看是不怎么好看的 参考:http://www.ruanyifeng.com/blog/search.html?cx=016304377626642577906%3Ab_e9ska ...

  5. 比特币原理——交易与UTXO

    UTXO UTXO (Unspent Transaction Output) 未花费交易输出 传统的支付系统都是基于账户(account based)的,即: 若A向B转账20元 判断A的账户余额大于 ...

  6. Spring Bean Expression Language(EL)

    1, Add dependency. <dependency> <groupId>org.springframework</groupId> <artifac ...

  7. 07-Django视图进阶

    1.调试模式 Django项目下的settings.py 默认是DEBUG=True,开发的时候一般要开启调试模式,当项目完成发布必须要改成False,否则会暴露网站的配置信息,修改以下两行: # D ...

  8. linux/kali安装及更新源以及输入法等配置

    准备工作1.kali 镜像的下载,官网选择对应的版本下载https://www.kali.org/downloads/ 2.VMware的安装,同官网可下载 更新源总结#更新源gedit /etc/a ...

  9. Java Swing 图形界面开发

    https://blog.csdn.net/xietansheng/article/details/72814492

  10. Java编程思想——第21章 并发

    前言 对于某些问题,如果能够并行的执行程序中的多个部分,则回变得非常方便甚至必要,这些部分要么看起来是并发执行,要么是在多处理环境下同时执行.并行编辑可以使程序执行速度得到极大提高,或者为设计某些类型 ...