- 首先来到你要爬取的视频网页,按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("失败")