鱼C论坛

 找回密码
 立即注册
查看: 1126|回复: 1

[技术交流] python协程相关问题求助!!!

[复制链接]
发表于 2022-2-14 21:48:26 | 显示全部楼层 |阅读模式
20鱼币
这是我爬取樱花动漫视频的源代码,我用了asyncio异步协程,因为樱花的视频是分片段的,下载要下载几百个视频片段,我用协程进行下载,但是到最后下载的很慢,都会丢失几个视频不下载,而且会请求超时,解码是也是一样,都会丢失几个,一直搞不明白,不知道怎么回事?希望大神们能帮下忙,看看是代码有问题,还是编译器的事,或者樱花的事?我编译器一直用的idle版本是3.10.1
import requests
import asyncio
import aiohttp
import aiofiles
import json
import os
import re
from Crypto.Cipher import AES
if not os.path.exists('video'):
    os.mkdir('video')
if not os.path.exists('dec_video'):
    os.mkdir('dec_video')
headers ={
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Mobile Safari/537.36',
        
        }
def get_m3u8_text(url):
    with requests.Session() as session:
        with session.get(url=url,headers=headers)as resp:
            
            with open('租借女友.m3u8','wb') as fp:
                fp.write(resp.content)
        return session
        
            
async def get_m3u8_url():
    async with aiofiles.open('租借女友.m3u8','r') as fp:
        tasks = []
        n = 0
        async for url in fp:
            if url.startswith('#'):
                continue
            url = url.strip()
            task = asyncio.create_task(get_ts(url,n))
            n = n + 1
            tasks.append(task)
        await asyncio.wait(tasks)


async def get_ts(url,n):
   
    name = f'video{n}.ts'
   
    async with aiohttp.ClientSession() as session:
        async with session.get(url=url,headers=headers) as resp:
            down_ts = await resp.content.read()
              
            async with aiofiles.open(f'video/{name}','ab') as fp:
                await fp.write(down_ts)
        
        print(f'{name}下载完成!!!')
        
def get_key_url():
    with open('租借女友.m3u8','r') as fp:
        m3u8_text = fp.read()
        
        obj = re.compile('URI="(?P<key_url>.*?)"',re.S)
        key_url = obj.search(m3u8_text).group('key_url')
        
        return key_url
def get_key(key_url,session):
    resp = session.get(url=key_url,headers=headers)
    key = resp.text
    return key
   
   
async def get_key_dec(key):
    tasks = []
    for line in range(502):
        name = f'video{line}.ts'
        tasks.append(asyncio.create_task(get_dec_ts(name,key)))
    await asyncio.wait(tasks)
        
async def get_dec_ts(name,key):
    key=key.encode("utf-8")
    aes = AES.new(key=key,IV=b'0000000000000000',mode=AES.MODE_CBC)
    try:
        
        async with aiofiles.open(f'video/{name}','rb') as f1,\
              aiofiles.open(f'dec_video/dec_{name}','ab') as f2:
            ts = await f1.read()
            await f2.write(aes.decrypt(ts))
    except ValueError:
        pass
    print(f'{name}解密完成!!!')
   
def merge_dec_ts():
    list1 = []
    for line in range(30):
        name = f'video{line}.ts'
        
        list1.append(f'dec_video/dec_{name}')
    ts = '+'.join(list1)
    os.system(f'copy/b {ts} 租借女友.mp4')
   
)
    print('合并完成!!!')


def main(url):
    session = get_m3u8_text(url)
    key_url = get_key_url()
    key = get_key(key_url,session)
    asyncio.run(get_m3u8_url())
    asyncio.run(get_key_dec(key))
    merge_dec_ts()


if __name__ == "__main__":
    url = 'https://video.dious.cc/20200726/UDugCauo/2000kb/hls/index.m3u8'
   
    main(url)
   

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-16 11:31:02 | 显示全部楼层
换了个番,奇奇怪怪的就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表