栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python爬取动态生成视频,m3u8后缀视频,后转为MP4视频文件

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python爬取动态生成视频,m3u8后缀视频,后转为MP4视频文件

  1. 首先来到你要爬取的视频网页,按F12,打开开发者模式
  2. 查看视频数据格式,可以看到这个视频格式是非MP4视频格式,属于实时的动态生成视频,无法直接获取
  3. 点击network,这里会显示所有动态请求的数据以及文件
  4. 点击视频播放,过一会就会显示多个以.ts为后缀的文件,这个就是我们需要爬取的视频文件
  5. 我们可以看到他的数据文件是由规律的,那么我们只要获取到他的.m3u8这就可以了,后边的就可以进行拼接
  6. 那么,我们爬虫肯定是进行批量爬取的,视频地址的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 ''
  1. 我们根据获取到的后缀为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

  1. 合并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("失败")
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/618525.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号