使用python搞定<百度云盘> 视频限速/网页限制(我们就给他拿下来)

5 篇文章 0 订阅
2 篇文章 0 订阅

 今天本来打算看个百度云盘的视频,在电脑上直接点开页面,看了才30秒,就要我保存到网盘才能继续看?????  这是什么操作

然后就保存到网盘。。。发现又是各种限制,配速也不行

既然不行,那我们就换一个办法(开始正题了哈)

首先第一步,找到他的m3u8文件,从接口里面捞了一下,还是很好找的

看下m3u8这个接口信息,是一个get请求, 但是直接拿出来请求不太好使,应该是在headers里面添加一些限制了(感兴趣的小伙伴可以去找下headers里面的内容,和api的参数拼接)

 

 

在这里我就不找api拼接规则和headers里面的限制了,感兴趣的朋友可以自己研究下

 直接把m3u8里面的文件全部复制到本地,而且m3u8也没有做加密,嘿嘿嘿

现在m3u8已经有了 我们就开始往下拉数据

我这里写了两种办法,我们先来看第一种,用过requests去挨个的请求m3u8里面的视频链接,并且进行保存,好使是好使,但是效率很慢,约700个的视频,需要下载十来分钟

import requests
 
# 百度云.m3u8 就是我们刚才保存在本地的m3u8文件
with open("m3u8/百度云.m3u8", mode='r', encoding='utf-8') as f:
    for line in f:
        line = line.strip()  # 去除空格,空白,换行符
        if line.startswith("#"):  # 如果是以# 号开头,直接过滤掉
            continue

        # 下载视频片段
        resp = requests.get(line)
        f = open(f"百度云/{n}.ts", mode='wb')
        f.write(resp.content)
        resp.close()
        print(f"{n}完成")
        n += 1

来看下第二种办法,通过协程的方式进行下载,大概要下载700个小视频,用协程的办法2分钟就搞定了

import aiohttp
import asyncio
import aiofiles


n = 1

 # 传入m3u8里面的视频的url链接和保存的本地的名称
async def save_local(url, title):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            print(response.headers['Content-length'])
            if int(response.headers['Content-length']) < 1:
                asyncio.create_task(save_local(url, str(title)))
            else:
                async with aiofiles. open(f"百度云2/{title}.ts", mode='wb') as f:
                    await f.write(await response.content.read())
                    print(f"{title}--完成")

# 读取m3u8里面的内容
async def save_video():
    tasks = []
    i = 1
    async with aiofiles.open("m3u8/百度云.m3u8", 'r') as rf:
        for line in await rf.readlines():
            line = line.strip()  # 去除空格,空白,换行符
            if line.startswith("#"):  # 如果是以# 号开头,直接过滤掉
                continue
            print(line)
            print(line.split('/')[-1])
            # task = asyncio.create_task(save_local(line, str(line.split('/')[-1])))
            task = asyncio.create_task(save_local(line, str(i)))
            tasks.append(task)
            i += 1
            # if i == 30:
            #     break
    await asyncio.wait(tasks)


if __name__ == '__main__':
    asyncio.run(save_video())
 

上面两种方式都可以保存下载,根据个人理解情况自行选择

下面就是保存下来所有的片段啦 

 

一共约700个小片段,下面就要把这些片段进行拼接,全部拼接在一起,最终形成一个完整的视频

# 直接读取写入,注意按照m3u8文件给出的顺序读取写入
import os

# ts临时存储路径
tmp_path = os.path.join(os.getcwd(), "百度云")

print(tmp_path)
# 读取并解析ts链接
# f = open("index.m3u8", "r", encoding="utf-8")
# m3u8 = f.readlines()
# f.close()

# url_list = [url.split("\n")[0] for url in m3u8 if "https" in url]

with open('最终合并视频.ts', 'wb') as f2:
    for url in range(1, 546):
        # file_name = url.split("/")[-1]
        ts_path = os.path.join(tmp_path, f"{url}.ts")
        f1 = open(ts_path, "rb")
        data = f1.read()
        f1.close()
        f2.write(data)
        os.remove(os.path.join(tmp_path, f"{url}.ts"))
f2.close()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜里亚批

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值