今天本来打算看个百度云盘的视频,在电脑上直接点开页面,看了才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()