nodejs 簡單學習之爬去視頻網站ts文件,合成一個ts視頻文件


 利用nodejs,request包 定時爬去 網站視頻ts接口,大概有1771個文件。

首先,獲取到網站的ts視頻分段配置文件,獲取到后,放入本地文件,方便下次使用。

然后,定時調用下載函數,進行下載,

爬去過程中會有下載失敗的,所有我在爬去完畢后,檢查下載失敗的,再次進行下載,

最后,exec包執行cmd命令 進行合成一個ts文件

const request = require("request");
const fs = require("fs");
const { exec } = require('child_process');
const emptyFile = [];
const failDownload = [];

function reload(results) {
    results.forEach(el => {
        let checkUrl = './download/' + el;
      //檢查文件是否已經存在 if(fs.existsSync(checkUrl)) {
        //獲取文件信息 const r = fs.statSync(checkUrl);
        //如果大小為0,則是下載失敗的 if(r && r.size == 0) { emptyFile.push(el);
          //刪除下載失敗的 const del = fs.unlinkSync(checkUrl); if(del) { throw '刪除ts文件異常' } else { console.log(el + '刪除成功') }
          //重新下載 download(el) } } else { download(el) } }); }
//這個合成函數在編輯中運行會報錯,暫且復制到cmd中運行的 function composite() {
  // "/b":表示按二進制合並;不加就默認按字符轉合並,會出問題 exec("copy /b H:\self-study\下載視頻流\download\*.ts H:\self-study\下載視頻流\download\冷血追擊.ts", (error, stdout, stderr) => { if (error) { console.error(`執行的錯誤: ${error}`); return; } console.log(`stdout: ${stdout}`); console.error(`stderr: ${stderr}`); }); } function download(url) { const baseUrl = 'https://youku.com-qq.net/20190502/181_7ffa42fa/1000k/hls/'; const downloadUrl = __dirname + '/download/' + url; request(baseUrl + url, (error, response, body) => { if(response) { failDownload.push(url); console.log(url + '下載成功') } if(error) { console.log(url + '下載失敗') } }) .pipe(fs.createWriteStream(downloadUrl))
  //下載后,按流直接寫入本地文件 } const reg = /(\w+\.ts)/mg; function getList(cb) { const getListFile = './download/getlist.txt'; function doGetAgain () { //獲取ts分段配置文件 request.get('https://youku.com-qq.net/20190502/181_7ffa42fa/1000k/hls/index.m3u8',(error, response, body) => { if(typeof body == 'string') { let results = body.match(reg); console.log(results); fs.writeFileSync(getListFile, results.join(',')) cb && cb(results); console.log('從服務器獲取') return results; } }) } //檢車本地是否有該文件 if(fs.existsSync(getListFile)) { let data = fs.readFileSync(getListFile, 'utf-8'); if(data) { console.log('從本地獲取'); cb(data.split(',')); } else { return doGetAgain(cb); } } return doGetAgain(cb); }
function tickerGet(results) { const len = results.length -1; let i = 0; const ticker = setInterval(() => { if(i <= len) { download(results[i]); i++; } else { clearInterval(ticker); reload(results); } }, 3000) }
getList(r => { //定時獲取下載 tickerGet(r); //重新下載失敗的文件 reload(r) //合成 composite(); });   

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM