爬虫学习 逆向爬虫(六)

多任务异步协程

**协程:**更高效的利用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 合并
相关推荐
盐焗西兰花3 小时前
鸿蒙学习实战之路-Reader Kit修改翻页方式字体大小及行间距最佳实践
学习·华为·harmonyos
QiZhang | UESTC3 小时前
学习日记day76
学习
久邦科技3 小时前
20个免费电子书下载网站,实现电子书自由(2025持续更新)
学习
喵手3 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Gain_chance3 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
Gain_chance5 小时前
36-学习笔记尚硅谷数仓搭建-DWS层数据装载脚本
大数据·数据仓库·笔记·学习
XH华5 小时前
备战蓝桥杯,第九章:结构体和类
学习·蓝桥杯
Gain_chance5 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
喵手6 小时前
Python爬虫实战:构建各地统计局数据发布板块的自动化索引爬虫(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集数据csv导出·采集各地统计局数据发布数据·统计局数据采集
Ziky学习记录7 小时前
从零到实战:React Router 学习与总结
前端·学习·react.js