爬虫-使用ffmpeg命令合并.m3u8文件 为mp4可播放文件

合并m3u8文件命令:

ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy 1.mp4

爬虫源码,用于爬取m3u8文件

注:很久之前写的,现在已经无法访问该网站了,这里只是提供一个思路

看了很多盗版网站,视频的格式都是m3u8,我们这里要做的就是了解到m3u8文件名之间的规律,从而获取到完整的文件名称,再进行访问、下载,最后使用ffmpeg进行合并,从而得到完整的视频

# 教程链接:https://www.bilibili.com/video/BV1yF411Y7Gv/?vd_source=c775f448411e442669c0a1b12a8a73bd

import requests
import re

url1 = "https://www.qiyue4k.com/player/4775"

# 给爬虫加一层壳
headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
}

# 模拟请求,获取状态码
response = requests.get(url=url1)

# 获取响应
# print(response.text)

# 获取第一个title,('<title>(.*?)</title>',response.text)此处为正则表达式
# 表示从第一个title开始到下一个title截止中间的东西我都要,response.text表示从这些内容中去匹配
title1 = re.findall('<title>(.*?)</title>',response.text)[0]
print(title1)

# 同理,从2150到m3u8的内容我都要
# 先将m3u8_url1进行切片,返回值变成列表,再去根据下标拿到想要的内容
m3u8 = re.findall('2150(.*?)m3u8',response.text)[0].split(":")[7]
# print(m3u8)
# print(type(m3u8_url1))
# print(len(m3u8_url1))

# 以下是针对字符串的处理,成功得到了m3u8的url
m3u80 = m3u8[2:120]
m3u81 = "m3u8"
m3u82 = "https://"
m3u8_url = m3u82+ m3u80 + m3u81
# print(len(m3u8_url3))
# print(m3u8_url)

# 请求m3u8的url,获取返回值进行分析
m3u8_url_date = requests.get(m3u8_url).text
# print(m3u8_url_date)

# re为正则表达式,sub为替换,参数1为要替换掉的内容,参数2为希望替换后的结果,参数3为替换范围
m3u8_url_date = re.sub('#EXTM3U','',m3u8_url_date)
m3u8_url_date = re.sub('#EXT-X-TARGETDURATION:10','',m3u8_url_date)
m3u8_url_date = re.sub('#EXT-X-MEDIA-SEQUENCE:0','',m3u8_url_date)
m3u8_url_date = re.sub('#EXT-X-PLAYLIST-TYPE:VOD','',m3u8_url_date)
m3u8_url_date = re.sub('#EXT-X-KEY:METHOD=AES-128,URI="/storage/uploads/media_space/movie/video/2022-04-28/1651133062463/enc.key",IV=0x04bf06aa4e3110bfb5df3ea2ecf6f727','',m3u8_url_date)
m3u8_url_date = re.sub('#EXT-X-ENDLIST','',m3u8_url_date)
# \d+正则:数字。+:表示一个或多个。\d+:匹配多个数字
m3u8_url_date = re.sub('#EXT-X-VERSION:\d','',m3u8_url_date)
m3u8_url_date = re.sub('#EXTINF:\d.\d+,','',m3u8_url_date)
m3u8_url_date = re.sub('#EXTINF:\d+.\d+,','',m3u8_url_date).split()
print(m3u8_url_date) #现在拿到的是列表类型

# 这一步是因为当时下载到1316.ts 报错了,导致后续没有下载成功
# m3u8_url_date1 = m3u8_url_date[1316:]

# 截止目前就获取到了全部的ts文件,但是ts文件的url并不完整,还需要进行拼接


# 网页中可以看到ts开头的请求
for i in m3u8_url_date:
    ts_url = "https://www.videogame.today/storage/uploads/media_space/movie/video/2022-04-28/1651133062463/" + i
    # 把文件名处理、命名下
    ts_name = ts_url.split('/')[10]
    # print(ts_url)
    # print(ts_name)
    # 保存数据
    ts_content = requests.get(url = ts_url).content
    with open(ts_name,mode='wb') as f:
        f.write(ts_content)
        print(ts_url)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值