# 1. 获取iframe里的m3u8地址
# 2.下载第一个m3u8,从第一个m3u8地址里获取第二个m3u8
# 3.下载视频
# 4. 解密
# 5. 合并视频
import asyncio
import aiofiles
import aiohttp
import requests
from bs4 import BeautifulSoup
def get_url_m3u8_first(url):
url_first_req = requests.get(url)
url_first_bs = BeautifulSoup(url_first_req.text, 'html.parser')
url_first_req.close()
return url_first_bs.find('iframe').get('data-play')
def get_m3u8_ts(url, layer, collection):
m3u8_first_ts_req = requests.get(url)
with open(f'../备份文件夹/协程_综合训练2/{layer}/第{collection}集.txt', mode='wb') as f:
f.write(m3u8_first_ts_req.content)
async def down_m3u8_second(url, name, session):
async with session.get(url) as down_m3u8_req:
async with aiofiles.open(f'../备份文件夹/协程_综合训练2/video/{name}', mode='wb') as f:
await f.write(await down_m3u8_req.content.read())
print(f'{name}下载完毕!')
async def m3u8_second_read(main_url, layer):
tasks = []
async with aiohttp.ClientSession() as session:
async with aiofiles.open(f'../备份文件夹/协程_综合训练2/第二层/第{layer}集.txt', mode='r', encoding='utf-8') as f:
async for line in f:
if str(line).startswith('#'):
continue
else:
line = str(line).strip()
url_m3u8_second = main_url + line
names = line.split('/')[-1]
tasks.append(asyncio.create_task(down_m3u8_second(url_m3u8_second, names, session)))
await asyncio.wait(tasks)
def main(url, collection):
# 第一层m3u8的url
url_m3u8_first = get_url_m3u8_first(url)
# 下载第一层的m3u8文件
get_m3u8_ts(url_m3u8_first, '第一层', collection)
# 获取第二层地址>>>>https://v7.dious.cc/20220801/l4CNv2DR/1500kb/hls/index.m3u8
with open(f'../备份文件夹/协程_综合训练2/第一层/第{collection}集.txt', mode='r', encoding='utf-8') as f:
url_m3u8_second = url_m3u8_first.split('/20220801')[0] + f.readlines()[-1].strip()
# 下载第二层的m3u8文件
get_m3u8_ts(url_m3u8_second, '第二层', collection)
# 读取第二层m3u8文件,并且拼接域名
asyncio.run(m3u8_second_read(url_m3u8_first.split('/20220801')[0], collection))
if __name__ == '__main__':
coll = 1
url_first = f'http://www.klz-toy.com/vodplay/yunhebianderenmen/2-{coll}.html'
main(url_first, coll)
报错信息
你设置代理试试