吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1983|回复: 17
收起左侧

[Python 原创] 协程爬取九九美剧视频并保存本地

  [复制链接]
龍魂小白 发表于 2023-7-19 00:10

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

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())

免费评分

参与人数 2吾爱币 +7 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hgz2323166169 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yu520 发表于 2023-7-21 08:57
刚好需要,太赞了
lingwushexi 发表于 2023-7-21 09:26
Fanun梵纯 发表于 2023-7-21 16:08
 楼主| 龍魂小白 发表于 2023-7-21 22:58

异步抓取非常的效率非常的快,取决于电脑运行状态和网有多快下载的就多快,
cookyjar 发表于 2023-7-23 14:53
放假正好需要,谢谢
w12928013 发表于 2023-7-23 15:35
谢谢分享。
lixinhai132 发表于 2023-7-26 15:47
谢谢分享
liuganglove2018 发表于 2023-7-26 22:58
这个很好用,谢谢大佬的好方法,
nhks 发表于 2023-7-28 13:26
代码bug很多,小白不能直接使用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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