m3u8后缀视频转为MP4视频文件
- 首先来到你要爬取的视频网页,按F12,打开开发者模式
- 查看视频数据格式,可以看到这个视频格式是非MP4视频格式,属于实时的动态生成视频,无法直接获取
- 点击network,这里会显示所有动态请求的数据以及文件
- 点击视频播放,过一会就会显示多个以.ts为后缀的文件,这个就是我们需要爬取的视频文件
- 我们可以看到他的数据文件是由规律的,那么我们只要获取到他的.m3u8这就可以了,后边的就可以进行拼接
- 那么,我们爬虫肯定是进行批量爬取的,视频地址的url跟爬取的m3u8的url不一样,应该怎么获取呢
实现思路:请求到页面的所有数据,根据正则表达式获取指定数据 (请自行分析需要的数据,修改表达式)
如下代码是可以获取到网页中为m3u8的url:
import random
import pandas as pd
from urllib import request
import re
from faker import Factory
class GetUrl():
def __init__(self,url):
self.url = url
def requestURL(self):
# 设置请求头,默认为python,防止被拦截
random.randint(0, 2) + random.random()
# 随机更改请求头
fc = Factory.create()
headers = {
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection': 'keep-alive',
'User-Agent': fc.user_agent(),
'Upgrade-Insecure-Requests': '1'
}
req = request.Request(self.url, headers=headers)
with request.urlopen(req) as f:
data = f.read().decode('utf-8')
text = data.splitlines()
for i in text:
if '.m3u8' in i or '.mp4' in i:
url_list = re.compile(r'\"(.*)\"').findall(i)
url_str = ''.join('%s' % i for i in url_list)
try:
return url_str
except UnboundLocalError as e:
print(self.url+'获取失败')
return ''
- 我们根据获取到的后缀为m3u8的url,拼接成.m3u8.[1++].ts的url爬取视频
(注意分好本地文件夹路径,因为一个视频会下载多个.ts后缀的视频,后期需要合并成一个MP4格式视频)
from tqdm import tqdm
# ts的url 文件夹名字 爬取m3u8格式数据,网页url+m3u8.+序号+.ts格式
def spiderm3(page_str, name):
# 设置请求头,默认为python,防止被拦截
random.randint(0, 2) + random.random()
# 随机更改请求头
fc = Factory.create()
headers = {
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection': 'keep-alive',
'User-Agent': fc.user_agent(),
'Upgrade-Insecure-Requests': '1'
}
for i in range(0, 1000):
file_name = page_str + '.' + str(i) + ".ts"
response = session.get(url=file_name, headers=headers)
if response.status_code == 200:
path = dir_path + '\\' + name
if not os.path.exists(path):
os.makedirs(path)
total_path = path + '\\' + str(i) + '.ts'
if len(response.content) == int(response.headers['Content-Length']):
# print total_path
with open(total_path, 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
f.close()
else:
break
- 合并ts文件为MP4格式数据
# ts文件夹名字 mp4文件夹名字 将ts文件合并为MP4
def get_video(name, mp4dirname):
path = dir_path + "\\" + name
files = os.listdir(path)
mp4path = mp4name + "\\%s\\%s.mp4" % (mp4dirname, name)
if os.path.exists(mp4path):
shutil.rmtree(path)
print(mp4path + '存在并删除')
else:
print(name+' 正在转为MP4数据格式:')
for i in trange(len(files)):
a = path + "\\%s.ts" % (str(i))
if os.path.exists(a):
with open(a, 'rb') as f1:
with open(mp4path, 'ab') as f2:
f2.write(f1.read())
else:
print("失败")
淘宝商品视频原址寻找并下载
- 进入视频页面,按F12,打开开发者模式,如图:
点击1,播放视频
点击2,使用选择器
将鼠标移动到3号区域,并点击
此时该区域代码块高亮,可以看到我们的视频不是直接视频地址显示的,不能直接获取视频地址进行爬取
-
点击network,看到页面的所有文件数据,也没能找到其他格式的视频文件以及数据
-
此时我们点击左上角按钮,清空所有的数据文件,点击视频页面的视频播放按钮,可以看到有多个不同的请求文件(其余png等文件可以省略,因为咱们要的是视频格式的文件数据)
-
点击请求文件,右侧跳出请求数据,就拿到了这个请求文件的url,
-
复制网址,并用浏览器打开,就看到了后端的返回数据,进行分析,我们看到了他有一个格式为MP4的数据,我们就再找一下他的url,后边我们就找到了他的网址
-
复制网址并打开,确认是我们想要的视频,
-
python实现下载网页MP4视频数据
# 爬取MP4格式视频url 文件名
def mp4(url, name):
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36",
"upgrade-insecure-requests": "1",
}
page = requests.get(url, headers=headers)
ret = page.content
path = dir_path + '\\MP4\\%s.mp4' % (name)
with open(path, 'wb') as f:
f.write(ret)