首页 > 编程语言 >Node抓取有道精品课视频

Node抓取有道精品课视频

时间:2023-06-14 21:35:28浏览次数:38  
标签:Node 视频 url data 精品课 抓取 json let config


最近想把有道精品课快过期的课程视频弄下来,刚开始想着录屏,但是那个太麻烦了,长一点的视频要一直在那里录制,影响其他工作,刚开始想着获取视频连接,看能不能下载,结果发开发现403,应该是加密处理了,不让直接下载

Node抓取有道精品课视频_有道精品课

头疼了一会儿,然后想着用迅雷下载一下试试看,结果真的能下载(后面发现,下载多了可能就下不了,但是开机重启又可以下载,没搞懂什么问题)

Node抓取有道精品课视频_ide_02

这个我目前只测试了购买的课程(在有效期内),获取所有视频的json文件,存到了excel里面,直接在json文件里面也可以下载,但是不方便直接看。视频链接是原画的链接,标清和高清的会在后面加上视频的大小;

Node抓取有道精品课视频_有道精品课_03


json文件效果如图,

Node抓取有道精品课视频_ios_04


excel文件如图,内容按分类存进了不同的sheet,

Node抓取有道精品课视频_json_05

我这里改了一下sheet的名称,因为名字里面不能含中英文的:


代码如下:

const fs = require('fs');
const axios = require('axios');
const xlsx = require('node-xlsx');

function writeXls(arr) {
    let buffer = xlsx.build(arr);
    fs.writeFileSync(config.xlsxPath, buffer, {"flag": "w"});
    console.log(`${config.xlsxPath} write success`);
}

/**
 * 获取请求数据写入文件
 * @param config
 */
function saveDataToFile(config) {
    // 设置请求头
    axios.get(config.url, {
        headers: {
            "Referer": "http://live.youdao.com/live/index.html?courseId=9219&lesson=662230&liveId=fe12574e347f&groupId=4102",
            "User-agent": "看不到看不到~",
            "Cookie": "自己账号的cookie"
        }
    }).then((res) => {
            let json = JSON.stringify(res.data);
            // console.log(JSON.stringify(json));
            fs.writeFileSync(config.filePath, json);
            console.log('write success!');
        }
    ).catch(function (err) {
        console.log(err);
    });
}

function getDataFromFile(config) {
    // 读取文件
    fs.readFile(config.filePath, {encoding: 'utf-8', flag: 'r'}, (err, data) => {
        if (err) {
            throw err;
        }
        let arr = [];
        JSON.parse(data).data.forEach(function (item, index) {
            const headers = ['标题', '视频链接', '总时长', '大小'];
            let datas = [headers];
            item.list.forEach(function (it) {
                let url, size;
                if (it.video) {
                    url = it.video.downloadUrl;
                    size = Math.floor(it.video.size / (1024 * 1024)) + 'm';
                } else {
                    url = '无';
                    size = 0;
                }
                datas.push([it.title, url, it.subTitle, size]);
            });
            arr.push({
                name: item.title.replace(':', '-'),
                data: datas
            });
        });
        writeXls(arr);
    });
}

let config = {
    // url打开视频页面,F12,查看network->xhr,可以看到获取所有课程的接口,请求的时候需要设置请求头
    url: 'https://ke.youdao.com/course/live/lessons.json?courseId=9219&r=1543288776707',
    filePath: 'data.json',
    xlsxPath: 'data.xlsx'
};
saveDataToFile(config);
// 文件写入有点慢,就延迟了3s再转成excel的
setTimeout(() => {
    getDataFromFile(config);
}, 3000);

 

标签:Node,视频,url,data,精品课,抓取,json,let,config
From: https://blog.51cto.com/u_16159492/6481496

相关文章

  • Node rar压缩/解压文件
    暂时未发现node有好用的rar解压/压缩库,所以就自己搜索了一下,简单写了一个,并做了个简单的封装。rar文件的压缩/解压是通过命令行来完成的,所以就需要node的child_process库,这个npmixxx就可以了。大概了解了下rar的语法,这个在WinRAR的安装文件目录下可以看到,我的是:C:/ProgramFiles......
  • Node Mysql操作封装
    由于最近要写个签到系统,频繁的操作mysql导致代码量暴涨,就想着优化下SQL的结构,减少工作量。'usestrict';varmysql=require('mysql');//数据库配置module.exports={/***数据库配置*/config:{host:'localhost',port:3306,......
  • 【JS错题总结】node中的微任务
    答案是n1n2p1p2 原因:node中的微任务包含两部分:1.process.nextTick()注册的回调(nextTicktaskqueue)2.promise.then()注册的回调(promise taskqueue) node在执行微任务时,会优先执行nextTicktaskqueue中的任务,执行完之后接着执行promisetaskqueue......
  • yarn 安装进行时,显现错误 node_modules\gifsicle: Command failed.
    1.错误显示[4/5]Buildingfreshpackages...[7/13]⠠jpegtran-bin[6/13]⠠gifsicle[8/13]⠠mozjpeg[4/13]⠠gifsicleerrorE:\IdeaStudyProjects\ucthings-ui-vue\node_modules\gifsicle:Commandfailed.Exitcode:1Command:nodelib/install.jsArguments:D......
  • npm install报错[email protected] postinstall: `node scripts/build.js`
    [email protected]: nodescripts/build.js解决方法:npmconfigsetsass_binary_site=https://npm.taobao.org/mirrors/node-sassnpminstall  ......
  • [nodejs] __dirname is not defined in ES module scope
    原因:CommonJS中提供的全局变量如require, exports, module.exports, __filename, __dirname等,在ESModules环境中均是不可用的,require, exports, module.exports在ESModules中基本对应着import,export,exportdefault。解决:import{dirname}from"node:path......
  • NodeJS研究笔记:利用Buffer类的二进制数据读取接口解析ELF文件格式
    javascript作为前端开发语言,自古来对二进制数据的读取解析方面的支持都很薄弱,一般来说,解析二进制数据时,往往是将数据转换成字符串,然后运用各种字符串操作技巧来实现二进制数据的读取。由于NodeJS作为后台服务器开发平台,数理逻辑的设计需求超越javascript作为前端语言时界面UI的设......
  • nodejs 和 mysql 连接
      原文https://www.mysqltutorial.org/mysql-nodejs/connect/   letmysql=require('mysql')letconnection=mysql.createConnection({host:'119.91.31.144',user:'test1',password:'',//密码database:......
  • node express mvc router 简单目录结构笔记
          只用来参考的  app.jsconstexpress=require('express');constmorgan=require('morgan');consttourRouter=require('./routes/tourRoutes');constuserRouter=require('./routes/userRoutes');constapp=e......
  • Burpsuite+Proxifier抓取exe数据包
    0x00 前言前几天在群里看到有师傅在问如何用Burpsuite抓取exe数据包的问题?所以想着写篇文章简单记录一下Burpsuite+Proxifier抓取exe数据包的方法。 注:记得很早之前我们抓exe数据包用的是岁月联盟的WSExplorer工具,但现在由于兼容性问题这个工具已经不太好使了,所以不得不换一......