python爬取动态生成视频,m3u8后缀视频转为MP4视频文件,某(tao)宝商品视频下载

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("失败")

淘宝商品视频原址寻找并下载

  1. 进入视频页面,按F12,打开开发者模式,如图:

点击1,播放视频
点击2,使用选择器
将鼠标移动到3号区域,并点击
此时该区域代码块高亮,可以看到我们的视频不是直接视频地址显示的,不能直接获取视频地址进行爬取

在这里插入图片描述

  1. 点击network,看到页面的所有文件数据,也没能找到其他格式的视频文件以及数据
    在这里插入图片描述

  2. 此时我们点击左上角按钮,清空所有的数据文件,点击视频页面的视频播放按钮,可以看到有多个不同的请求文件(其余png等文件可以省略,因为咱们要的是视频格式的文件数据) 在这里插入图片描述

  3. 点击请求文件,右侧跳出请求数据,就拿到了这个请求文件的url,
    在这里插入图片描述

  4. 复制网址,并用浏览器打开,就看到了后端的返回数据,进行分析,我们看到了他有一个格式为MP4的数据,我们就再找一下他的url,后边我们就找到了他的网址
    在这里插入图片描述

  5. 复制网址并打开,确认是我们想要的视频,

  6. 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)
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值