爬虫学习 逆向爬虫(六)

多任务异步协程

**协程:**更高效的利用CPU

python 复制代码
import time

def func():
    print("黎明")
    time.sleep(3)
    print("还是黎明")

func()

等待时机长 sleep时CPU不再工作 IO操作 (费时不费力)->阻塞

线程运行阻塞后 移出主线程 移动到下一个

4个任务一个线程 线程池多线程切换消耗资源,而此不耗

event_loop 轮巡

python实现协程

python 复制代码
import asyncio  #借助event_loop

async def func():#协程  生成器
    print("233") 

 
if __name__ == "__main__":
    result = func()
    #print(result)
    
    asyncio.run(result)#loop.close()可能报错
    #同下
"""   
    event_loop = asyncio.get_event_loop()
    #event_loop执行协程对象,直到该对象内容执行完毕
    event_loop.run_until_complete(result)
"""
    

官方方案

python 复制代码
import asyncio  #借助event_loop
import time

async def func1():
    print("func1")  
    await asyncio.sleep(1)
    print("func1 over")

async def func2():#协程  生成器
    print("func2") 
    await asyncio.sleep(2)
    print("func2 over")


async def func3():#协程  生成器
    print("func3") 
    await asyncio.sleep(3)
    print("func3 over")

#多函数任务
 
if __name__ == '__main__':
    start = time.time()
    result1 = func1()
    result2 = func2()
    result3 = func3()
    #三个任务放一起
    tasks = [result1,result2,result3,]

asyncio.run(asyncio.wait(tasks)) #无阻塞
print(time.time() - start())
    #await 挂起

gather wait区别:

python 复制代码
import asyncio

async def func1():
    print("func1")  
    await asyncio.sleep(1)
    print("func1 over")
    return "func1 返回值"

async def func2():#协程  生成器
    print("func2") 
    await asyncio.sleep(2)
    print("func2 over")
    return "func2 返回值"

async def func3():#协程  生成器
    print("func3") 
    await asyncio.sleep(3)
    print("func3 over")
    return "func2 返回值"

async def main():
    f1 = func1()
    f2 = func2()
    f3 = func3()

    tasks = [
        asyncio.create_task(f1),
        asyncio.create_task(f2),
        asyncio.create_task(f3),
        ]
    result =  asyncio.gather(*tasks) #位置参数   有顺序   
    #结束,运行
    done,pending = await asyncio.wait(tasks)#第二
    #print(done)
    #print(pending) 空
    """
    for t in done:
        print(t.done())#done set集合 无序 返回结果没有顺序
    """
   

if __name__ == "__main__":
    asyncio.run(main())

视频下载

python 复制代码
    
"""
    <video>
    无直接url,占网速,占内存
    切片 .ts
    名称散列    顺序
    ts文件正确顺序保存 ->M3U -> urf-8 -> M3U8
        1请求M3U8文件
        2加载ts文件
        3正常播放
    服务器压力小,用户体验好
    
"""

M3U8 文件简介

m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。但无论是哪种播放列表,其内部文字使用的都是 utf-8 编码。

当 m3u8 文件作为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。其格式如下所示:

python 复制代码
#EXTM3U
#EXT-X-TARGETDURATION:10

#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
python 复制代码
"""
    <video> 无直接url,占网速,占内存
    .ts 是视频切片
    名称散列    顺序
    ts文件正确顺序保存 ->M3U -> urf-8 -> M3U8
        1请求M3U8文件
        2加载ts文件
        3正常播放
    服务器压力小,用户体验好

    #EXTM3U
    #EXT-X-TARGETDURATION:13 //视频最大切片时长
    #EXT-X-KEY:METHOD=AES-128,URI="key.key" //切片文件加密方式&密钥地址
                        对称加密
"""
python 复制代码
"""步骤"""
#拿到视频页的页面源代码
#找到iframe src 为M3U8
#请求到src对应的页面源代码  M3U8地址
#第一层M3U8
#第二层
#ts解密
#对ts 合并
相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习