首页 > 编程语言 > Python爬虫-第四章-5-高效抓取视频网站视频资源至本地

Python爬虫-第四章-5-高效抓取视频网站视频资源至本地

时间:2023-02-10 18:35:44浏览次数:43  
标签:视频 加密 文件 Python m3u8 ts 爬虫 url

本章内容:

   91看剧抓取影视资源

   流程:

       1.获取影片播放页面源码

       2.获取m3u8链接地址

       3.下载m3u8文件

       4.读取m3u8文件,在下视频

       5.合并视频


'''
一般视频网站对视频的处理方式:
1.获取用户上传视频内容
2.转码(将得到的视频内容进行各种清晰都转码备份【标清-超清等等版本】)
3.将转码后的视频进行切片加工【比如一分钟视频切成6份,10秒一份】
4.将视频的播放信息存入M3U文件,中国区会转码为utf-8,大部分为M3U8文件
5.用户在线播放时,根据进度条所处的位置获取切片视频的索引,加载前后内容
比如 ================【滚动条】==========================
这种处理方式避免了全部内容加载造成的资源和时间浪费
M3U8文件的处理方式:
1.找到视频网站的M3U8文件(一般会被隐藏)
2.通过 M3U8 文件找到 ts 文件(切片后的视频片段)
3.通过工具或编码将 ts 文件剪辑拼接还原为完整的 mp4
'''
import requests
import re
import aiohttp
import asyncio
import aiofiles
from fake_useragent import UserAgent

# start------------------------------
# 下载m3u8文件
url = 'https://www.91kanju.com/vod-play/62812-2-1.html'
ua = UserAgent()
user_agent = ua.random
headers = {
'user-agent': user_agent
}
# resp = requests.get(url,headers=headers)
obj = re.compile(r"url: '(?P<url>.*?)',", re.S)
# m3u8_url = obj.search(resp.text).group('url')
# resp.close()
# m3u8_url = 'https://m3api.awenhao.com/index.php?note=kkRfha41qde6r7nytsgzb&raw=1&n.m3u8'
# resp2 = requests.get(m3u8_url,headers=headers)
# with open('../FileForDemo/91kanju/韩剧流星.m3u8', mode='wb') as file:
# file.write(resp2.content)
# resp2.close()

# 解析m3u8文件
m3u8_urls = []
with open('../FileForDemo/91kanju/韩剧流星.m3u8', mode='r', encoding='utf-8') as filem3u8:
for line in filem3u8:
line = line.strip()
if line.startswith('#'):
continue
m3u8_urls.append(line)


async def aioDownload(index, url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
content = await resp.content.read()
async with aiofiles.open(f'../FileForDemo/91kanju/韩剧流星片段/{index}.ts', mode='wb') as ts:
await ts.write(content)
print(f'ts{index}下载完毕!!!')


async def main():
tasks = []
for index, url in enumerate(m3u8_urls):
tasks.append(asyncio.create_task(aioDownload(index, url)))
await asyncio.wait(tasks)


if __name__ == '__main__':
asyncio.run(main())
print('全部下载完毕!!!')

# end------------------------------

如果视频被加密,处理思路如下:

1.从页面源码中拿到m3u8文件路径并下载m3u8文件
2.在第一层m3u8文件中拿到真实m3u8文件【含有ts文件路径或被加密后文件路径】
3.下载ts文件或被加密的文件到本地【比如伪装成.jpg文件】
4.参考网站加密逻辑进行将参数加密(参考浏览器 Call Stack,观察参数加密前后变化使用了哪一个函数过程)
5.使用加密后参数向网站进行请求,抓取内容并下载真实ts文件到本地
6.参考第二层m3u8文件中的加密方式进行解密得到可播放ts文件
7.合并ts文件成mp4

标签:视频,加密,文件,Python,m3u8,ts,爬虫,url
From: https://blog.51cto.com/mooreyxia/6049675

相关文章