今天分享的是协程异步抓取影院加密视频
本帖最后由 龍魂小白 于 2023-7-21 22:59 编辑今天分享的是协程异步抓取影院加密视频
共同学习进步
代码如下:
```
import asyncio
import os.path
import re
import os
import aiohttp
import requests
path = '影院'
# 自行替换该影院URL 主页:http://www.cdhxjdsb.com/
url = 'http://www.cdhxjdsb.com/dongzuopian/zhetianjinqu/1-1.html'
ts_url = []
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
async def getindex_m3u8(url):
'''
:param url: 要下载的视频URL
:return: 返回m3u8和key的数据
'''
# 获取index.m3u8的链接
async with aiohttp.ClientSession(headers=headers) as session:
async with session.get(url, verify_ssl=False) as get_url:
data = await get_url.text()
r = re.search('"url":"(.*?)"', data).group(1)
# 去除转义符获得正确的index.m3u8链接
env_key = r.strip().replace("\\", '')
print(env_key)
# 获取key加密文件后边进行解密
key = env_key.replace('index.m3u8', 'enc.key')
print(key)
# 请求m3u8链接数据
async with aiohttp.ClientSession(headers=headers) as session2:
async with session2.get(env_key) as gei_m3u8:
m3u8 = await gei_m3u8.text()
# 请求key数据
async with aiohttp.ClientSession(headers=headers) as session3:
async with session3.get(key) as gei_key:
m3u8_key = await gei_key.text()
return m3u8, m3u8_key
async def mkdir_path(m3u8, m3u8_key):
'''
:param m3u8: 传入数据
:param m3u8_key: 传入数据
:return:
'''
# 创建文件夹,进行路径判断
if not os.path.exists(path):
# 创建文件夹
os.mkdir(path)
# 获取到的m3u8进行写入保存
with open(os.path.join(path, 'index.m3u8'), 'w') as f:
f.write(m3u8)
# 获取到的key进行写入保存
with open(os.path.join(path, 'enc.m3u8'), 'w') as a:
a.write(m3u8_key)
# 进行读取转换成自己的ts文件名
with open(os.path.join(path, 'index.m3u8'), 'r') as r:
date = r.readlines()
aa = open(os.path.join(path, 'index2.m3u8'), 'w')
e = 0
# 遍历原m3u8文件
for i in date:
# 判断进行转换成自己的ts文件名
if i.startswith("#"):
# 判断URL是否存在
if i.find('URI') != -1:
uu = i
i = re.sub(r'(#EXT-X-KEY:METHOD=AES-128,URI=)"(.*?)"',
f'#EXT-X-KEY:METHOD=AES-128,URI="enc.m3u8"', uu)
aa.write(i)
continue
else:
# 重写ts文件名
aa.write(str(e) + '.ts' + '\n')
ts_url.append(i.strip())
e += 1
async def dowmlaod(index, value):
'''
:param index: 接受下标
:param value: 接受URL
:return:
'''
# 请求URL获取字节数据
async with aiohttp.ClientSession(headers=headers) as session:
async with session.get(value, verify_ssl=False) as get_url:
data = await get_url.content.read()
# 开始写入保存ts视频文件
with open(os.path.join(path, f'{index}.ts'), 'wb') as f:
f.write(data)
print('下载完成' + str(index))
#
# # '''
# # 进行ts文件合并 解决视频音频不同步的问题 建议使用这种
# # :param filePath:
# # :return:
# # '''
# print('开始')
#
# ccc = os.chdir(path)
#
# os.system("ffmpeg -i index2.m3u8 -c copy cccc.mp4")
# print('结束')
async def ffmpeg():
'''
用ffmpeg合并处理加密
:return:
'''
print('开始')
ccc = os.chdir(path)
os.system("ffmpeg -i index2.m3u8 -c copy cccc.mp4")
print('结束')
async def main():
m3u8, m3u8_key = await getindex_m3u8(url)
print(m3u8)
print(m3u8_key)
await mkdir_path(m3u8, m3u8_key)
task = []
# 遍历下载所有ts文件 (获取ts的URL和索引)
for index, value in enumerate(ts_url):
task.append(dowmlaod(index,value))
await asyncio.gather(*task)
await ffmpeg()
if __name__ == '__main__':
asyncio.run(main())
``` 目前正在学习框架,过几天分享 {:301_997:}记不清楚以前是在谁那看到一个:Webview2(不是Android的那个Webview,是微软的Webview2)+WinForm+C#+.net4.6+Selenium+JavaScript脚本自动化模拟人工组合操作后台批量下载XX网站视频。
同时也要吐槽一下,Webview2的样例代码太少了(要自己摸索,没得Ctrl+C、V)
{:301_979:} 这个厉害了啊 这个老厉害了 用的其他插件下载m3u8,下载的音影不同步。先收藏了。 厉害了,感谢老铁 感谢分享,学习了。 最近在头疼这个,刚好用得到, 又学到了,感谢!