龍魂小白 发表于 2023-7-21 22:55

今天分享的是协程异步抓取影院加密视频

本帖最后由 龍魂小白 于 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())

```

龍魂小白 发表于 2023-7-27 21:47

目前正在学习框架,过几天分享

BLUE7777777 发表于 2023-7-22 00:57

{:301_997:}记不清楚以前是在谁那看到一个:Webview2(不是Android的那个Webview,是微软的Webview2)+WinForm+C#+.net4.6+Selenium+JavaScript脚本自动化模拟人工组合操作后台批量下载XX网站视频。
同时也要吐槽一下,Webview2的样例代码太少了(要自己摸索,没得Ctrl+C、V)
{:301_979:}

me44 发表于 2023-7-22 07:00

这个厉害了啊

daoye9988 发表于 2023-7-22 07:59

这个老厉害了

knight0531 发表于 2023-7-22 08:17

用的其他插件下载m3u8,下载的音影不同步。先收藏了。

echoaku 发表于 2023-7-22 09:30

厉害了,感谢老铁

xinxiu 发表于 2023-7-22 10:41

感谢分享,学习了。

鹿鸣 发表于 2023-7-22 11:07

最近在头疼这个,刚好用得到,

ZFY256 发表于 2023-7-22 11:28

又学到了,感谢!

LM88 发表于 2023-7-22 11:33

页: [1] 2 3
查看完整版本: 今天分享的是协程异步抓取影院加密视频