找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 文档 工具 设计
查看: 64|回复: 0

协程爬取九九美剧视频并保存本地

[复制链接]

1万

主题

922

回帖

2万

积分

超级版主

教育辅助界扛把子

附加身份标识
精华
1
热心
2
听众
1
威望
57
贡献
12012
违规
0
书币
5705
注册时间
2020-4-8

论坛元老灌水之王

发表于 2023-7-19 21:39 | 显示全部楼层 |阅读模式
协程爬取九九美剧视频并保存本地

[Python] 纯文本查看 复制代码
import os.path
import urllib.parse
import asyncio
import aiohttp
import re

# 禁用证书验证警告
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

path = 'ts'
# 目标URL
url = 'https://www.99meijutt.com/play/102788-1-0.html'

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'
}

ts_url_list = []

# 获取第一次url
async def get_url(url):
    async with aiohttp.ClientSession(headers=headers) as session:
        async with session.get(url, verify_ssl=False) as response:
            data = await response.text()
    url_m3u8 = re.search('now="(.*?)"', data).group(1)
    return url_m3u8

# 获取m3u8文件的URL
async def get_m3u8url(url_m3u8):
    async with aiohttp.ClientSession(headers=headers) as session:
        async with session.get(url_m3u8, verify_ssl=False) as response:
            data = await response.text()
    # 使用最后一行的URL拼接完整的m3u8文件URL
    url2 = urllib.parse.urljoin(url_m3u8, data.split()[-1])
    return url2

# 获取ts文件的URL并下载
async def get_tsurl(url2, base_url):
    i = 0
    async with aiohttp.ClientSession(headers=headers) as session:
        async with session.get(url2, verify_ssl=False) as response:
            data = await response.content.read()

    with open('u8m3_url.m3u8', 'wb') as f:
        f.write(data)

    with open('u8m3_url.m3u8', 'r') as f:
        get_tsurll = f.readlines()
    aa = open(os.path.join(path, 'do_m3u8.m3u8'), 'w')
    for ts_url in get_tsurll:
        if ts_url.startswith("#"):
            aa.write(ts_url)
            continue
        else:
            aa.write(str(i) + f'.{path}\n')
            # 拼接完整的ts文件URL
            full_ts_url = urllib.parse.urljoin(base_url, ts_url.strip())
            ts_url_list.append(full_ts_url)
        i += 1

# 下载ts文件
async def download(full_ts_url, i):
    async with aiohttp.ClientSession(headers=headers) as session:
        async with session.get(full_ts_url, verify_ssl=False) as response:
            data = await response.content.read()

    if not os.path.exists(path):
        os.mkdir(path)

    with open(os.path.join(path, str(i) + '.ts'), 'wb') as f:
        f.write(data)
        print('下载完成')

def merge(filename='output'):
    '''
    进行ts文件合并 解决视频音频不同步的问题 建议使用这种
    :param filePath:
    :return:
    '''
    print('开始')

    c = os.chdir(path)
    print(c)
    cmd = f'ffmpeg -i do_m3u8.m3u8 -c copy {filename}.mp4'
    os.system(cmd)
    print('结束')

async def main():
    # 获取第一次的URL
    first_url = await get_url(url)
    print('第一次的URL:', first_url)

    # 获取m3u8文件的URL
    m3u8_url = await get_m3u8url(first_url)
    print('m3u8文件的URL:', m3u8_url)

    # 获取ts文件的URL并下载
    await get_tsurl(m3u8_url, first_url)

    # 并发下载TS文件
    tasks = []
    for i, ts_url in enumerate(ts_url_list):
        tasks.append(download(ts_url, i))

    await asyncio.gather(*tasks)

    merge()

if __name__ == '__main__':
    asyncio.run(main())
Great works are not done by strength, but by persistence! 历尽艰辛的飞升者,成了围剿孙悟空的十万天兵之一。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@cdsy.xyz

QQ|Archiver|手机版|小黑屋|城东书院 ( 湘ICP备19021508号-1|湘公网安备 43102202000103号 )

GMT+8, 2024-5-4 20:08 , Processed in 0.038031 second(s), 27 queries .

Powered by Discuz! CDSY.XYZ

Copyright © 2019-2023, Tencent Cloud.

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