首页 > 其他分享 >爬虫(m3u8格式视频文件)

爬虫(m3u8格式视频文件)

时间:2024-03-26 19:35:42浏览次数:33  
标签:name m3u8 url 爬虫 ts 视频文件 async line

点击查看代码
import re
import requests
from lxml import etree
import asyncio
import aiohttp
import aiofiles
import os
from Crypto.Cipher import AES

# 获取第一层m3u8文件的url并下载
def first_m3u8_url(url):
    resp = requests.get(url, verify=False)
    html = etree.HTML(resp.text)
    resp.close()
    script_text = html.xpath('/html/body/div/div[1]/div[1]/div[1]/div[2]/div/script[1]/text()')[0]
    obj = re.compile(r'var now="(?P<first_url>.*?)";', re.S)
    first_url = obj.search(script_text).group('first_url')
    return first_url


def m3u8_download(url, name):
    resp = requests.get(url)
    with open(name, mode='wb') as f:
        f.write(resp.content)
    resp.close()

# 获取第二层m3u8文件的url并下载
def second_m3u8_url(url):
    with open('first_m3u8.txt', mode='r', encoding='utf-8') as f:
        for line in f:
            if line.startswith('#'):
                continue
            line = line.strip()
            second_url = url.rsplit('/', 3)[0] + line
            m3u8_download(second_url, 'second_m3u8.txt')
            return second_url

# 读取全部ts文件的url,拼接出正确的下载地址,异步下载
async def download_ts(url, name, session):
    async with session.get(url) as resp:
        async with aiofiles.open(f'video/{name}', mode='wb') as f:
            await f.write(await resp.content.read())
    print(f"{name} 完成")


async def aio_download(url):
    tasks = []
    async with aiohttp.ClientSession() as session:
        async with aiofiles.open('second_m3u8.txt', mode='r', encoding='utf-8') as f:
            async for line in f:
                if str(line).startswith('#'):
                    continue
                line = str(line).strip()
                file_name = line.rsplit('/', 1)[1]
                ts_url = url.rsplit('/', 5)[0] + line
                task = asyncio.create_task(download_ts(ts_url, file_name, session))
                tasks.append(task)
            await asyncio.wait(tasks)

# 从文件中读取加密格式
def get_key(url):
    with open('second_m3u8.txt', mode='r', encoding='utf-8') as f:
        for line in f:
            if line.startswith('#EXT-X-KEY'):
                line_str = line
                break
    obj = re.compile(r'URI="(?P<URI>.*?)"', re.S)
    uri = obj.search(line_str).group('URI')
    key_url = url.rsplit('/', 3)[0] + uri
    resp = requests.get(key_url)
    return resp.text

# 对所有的ts文件异步解码
async def dec_ts(key, name):
    aes = AES.new(key=key.encode('utf-8'), IV=b"0000000000000000", mode=AES.MODE_CBC)
    async with aiofiles.open(f'video/{name}', mode='rb') as f1,\
        aiofiles.open(f'video/temp_{name}', mode='wb') as f2:
        bs = await f1.read()
        await f2.write(aes.decrypt(bs))
    print(f'{name}完成')


async def aio_dec(key):
    tasks = []
    async with aiofiles.open('second_m3u8.txt', mode='r', encoding='utf-8') as f:
        async for line in f:
            if str(line).startswith('#'):
                continue
            line = str(line).strip()
            file_name = line.rsplit('/', 1)[1]
            task = asyncio.create_task(dec_ts(key, file_name))
            tasks.append(task)
        await asyncio.wait(tasks)

# 将解码后的ts文件拼接,注意:os模块中指令过长无法在pycharm中使用
def merge_ts():
    ls = []
    with open('second_m3u8.txt', mode='r', encoding='utf-8') as f:
        for line in f:
            if line.startswith('#'):
                continue
            line = line.strip()
            file_name = line.rsplit('/', 1)[1]
            ls.append(f'video/temp_{file_name}')
    ts = "+".join(ls)
    os.system('copy /b ' + f'{ts} movie.mp4')
    print('ok')


def main(url):
    first_url = first_m3u8_url(url)
    m3u8_download(first_url, 'first_m3u8.txt')
    second_url = second_m3u8_url(first_url)
    asyncio.run(aio_download(second_url))
    key = get_key(first_url)
    asyncio.run(aio_dec(key))
    merge_ts()


if __name__ == "__main__":
    video_url = "https://www.99meijutt.com/play/97071-0-0.html"
    main(video_url)

标签:name,m3u8,url,爬虫,ts,视频文件,async,line
From: https://www.cnblogs.com/only-you-zta/p/18097385

相关文章

  • python爬虫小案例-re正则
    案例如下:1.使用正则表达式和文件操作爬取并保存“某吧”某帖子全部内容(该帖不少于5页。本次选取的是某吧中的NBA吧中的一篇帖子,帖子标题是“克莱和哈登,谁历史地位更高”。爬取的目标是帖子里面的回复内容。源程序如下:importcsvimportrequestsimportreimporttime......
  • 使用 Kotlin DSL 编写网络爬虫
    本博文将会通过一个网络爬虫的例子,向你介绍Kotlin的基本用法和其简洁有力的DSL。关于DSL按照维基百科的说法,DSL(domain-specificlanguage)是一种专注于某一特定应用领域的计算机语言。和我们常用的通用目的型语言(类如C,Java,Python等)相反,DSL并不承诺可用来解决一切可计算......
  • Rust高级爬虫:如何利用Rust抓取精美图片
    引言在当今信息爆炸的时代,互联网上的图片资源丰富多彩,而利用爬虫技术获取这些图片已成为许多开发者的关注焦点。本文将介绍如何利用Rust语言进行高级爬虫编程,从而掌握抓取精美图片的关键技术要点。Rust爬虫框架介绍Rust语言生态中有许多优秀的爬虫框架,以下是其中一些常......
  • 32个Python爬虫项目让你一次吃到撑
    今天为大家整理了32个Python爬虫项目。整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。豆瓣读书爬虫。可以爬下豆瓣读......
  • Python之Scrapy爬虫框架安装及使用详解
    声明文章所涉及的内容仅为学习交流所用。前言:        Scrapy是用Python实现的一个为了采集网站数据、提取结构性数据而编写的应用框架。常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过Scrapy框架实现一个爬虫,抓取指......
  • 爬虫之JS混淆和加密案例
    需求:中国空气质量在线监测分析平台是一个收录全国各大城市天气数据的网站,包括温度、湿度、PM2.5、AQI等数据,链接为:https://www.aqistudy.cn/html/city_detail.html,网站显示为:一连串的分析该网站所有的空气质量数据都是基于图表进行显示的,并且都是触发鼠标滑动或者点动......
  • 爬虫之多任务异步协程
    gevent模块示例代码:特点:可以识别所有阻塞fromgeventimportmonkeymonkey.patch_all()importgeventimportrequestsfromlxmlimportetreeimporttime#发送请求defget_request(url):page_text=requests.get(url).texttree=etree.HTML(page_text)......
  • 爬虫工作量由小到大的思维转变---<第五十四章 Scrapy 降维挖掘---中间件系列(3)>
    前言:继续上一章:https://hsnd-91.blog.csdn.net/article/details/136977606本章主要介绍:UrlLengthMiddleware和DepthMiddleware是Scrapy框架中的关键Spider中间件,自此,爬虫中间件部分,一共5个算是全部介绍完毕!UrlLengthMiddleware的功能主要是设置和限制请求的URL长度......
  • 爬虫工作量由小到大的思维转变---<第五十五章 Scrapy 降维挖掘---中间件系列(4)>
    前言:爬虫中间件的文章:https://hsnd-91.blog.csdn.net/article/details/136977606https://hsnd-91.blog.csdn.net/article/details/136978069讲完了爬虫中间件(5个),现在就应该归类到下载中间件(11个)!下载器中间件的作用和重要性        下载器中间件是Scrapy......
  • 爬虫实战+数据分析:全国消费支出分析及未来预测
    在本篇文章中,爬虫的讲解不仅仅局限于爬虫本身,还会引申至另一个重要领域:数据分析。对我们而言,爬虫的核心价值实际上在于获取数据,一旦获得了数据,接下来必然是要加以利用。数据分析便是其中关键一环,因此在爬虫的讲解之后,我们将会稍作涉及与数据分析相关的知识要点。今天主要任务是爬......