【问题标题】:Is there a way to scraping or crawl the m3u8 playlist?有没有办法抓取或抓取 m3u8 播放列表?
【发布时间】:2021-12-12 02:04:12
【问题描述】:

我是一名学生,正在尝试建立一个用于练习目的的电影网站项目。

但我只知道电影的数据库会很大,所以我就想“如果我只是从另一个网站借电影怎么办”,所以我查找并找到了一个名为“Scrape or Crawl Data”的术语,当然,这是出于非商业目的,我只是想让我的项目工作。因此,如果这是非法的或不正确的做法,请在下方发表评论,我会考虑到这一点。

但是如果可以的话,有什么办法可以得到 m3u8 播放列表吗? 我不知道该怎么做(完全,老实说)。所以我真的需要一个指南或一些指导,我需要做的方向。

由于我的研究,我打算使用一些cheerio,Axios并尝试以某种方式解决。

更具体地说,每当我播放视频时,如果我在网络选项卡上检查它,它将包含一个名为 playlist.m3u8 的文件,其中包含许多小的 .ts 文件。我想以某种方式获取它并将其转移到我的项目中。

【问题讨论】:

    标签: javascript node.js reactjs web-scraping web-crawler


    【解决方案1】:

    playlist.m3u8 文件就是一个播放列表,其中包含有关视频的数据以及指向视频文件/块的链接,或指向包含该文件/块的块列表的链接。

    根据您的项目,它可能已经内置了查看 m3u8 文件的方法,在基于浏览器的项目中,您只需将视频元素的 url 设置为 .m3u8 的 url。

    如果还没有使用 m3u8 文件的方法,您将不得不下载解析器或自己编写一个。

    这是一个简单的 JS 解析器,它会按顺序读取每个 ts 并将它们附加到视频的末尾,因为它会忽略计时数据和所有其他额外信息,它会很容易出错,但只是一个简单的意思例子。

    //This is a simple example that is non-reliable and should not be relied upon.
    
    const fs = require('fs');
    const http = require('http');
    
    const source_domain = "http://sourcehost.com/";
    
    const playlist_path = "playlist.m3u8";
    
    var video_file = fs.createWriteStream("test.mp4");
    
    GetPlaylist(source_domain + playlist_path); 
    
    function GetPlaylist(url){
        return new Promise((resolve, reject) => {
            http.request(url, (res) => {
                var data = '';
            
                res.on('data', (chunk) =>{
                    data += chunk;
                });
                
                res.on('end', async () => {
                    var lines = data.split("\n");
                    for(var line of lines){
                        if(line.indexOf(".ts") !== -1){
                            await GetChunk(source_domain + line);
                        }
                    }
                    video_file.end();
                });
    
                res.on('timeout', () => {
                    reject('timeout');
                });
            }).end();
        });
    }
    
    
    function GetChunk(chunk_path){ 
        return new Promise((resolve, reject) => {
            http.request(chunk_path, (res) => {
                res.setEncoding('binary');
            
                res.on('data', (chunk) =>{
                    video_file.write(chunk, 'binary');
                });
                
                res.on('end', () => {
                    resolve();
                });
    
                res.on('timeout', () => {
                    reject('timeout');
                });
            }).end();
        });
    }
    

    【讨论】:

    • 感谢您的解释和代码。这对我来说真的很新鲜,所以我真的不知道从哪里开始。我主要是为一个小项目创建自己的数据库和自己的数据集,这次我只是想让它有点不同,这有点难。不过非常感谢。
    • @Bunny 很高兴这有点帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多