当前位置: 首页 > 后端技术 > Node.js

节点批量抓取头条视频并保存

时间:2023-04-03 18:09:54 Node.js

目标网站:西瓜视频项目功能:下载头条号下最新20个视频【微臣财经】项目地址:Github地址姊妹项目:批量下载美图介绍通用批量例程爬取视频或者图片就是使用爬虫获取文件链接的集合,然后通过writeFile等方法将文件一个一个保存下来。但是头条视频无法抓取需要抓取的html文件(服务端渲染输出)中的视频链接。视频链接是在客户端渲染页面时,通过一些js文件中的算法或解密方法,根据已知视频的key或hash值,动态计算并添加到video标签中。这也是网站的一种防爬措施。当我们浏览这些页面时,我们可以通过查看元素看到计算出的文件地址。但是在批量下载的时候,手动一个一个获取视频链接显然不可取。幸运的是,puppeteer提供了模拟访问Chrome的功能,让我们可以爬取浏览器渲染的最终页面。项目启动命令npminpmstartNotice:安装puppeteer的过程有点慢,请耐心等待。配置文件//配置相关module.exports={originPath:'https://www.ixigua.com',//页面请求地址savePath:'D:/videoZZ'//存储路径}技术点puppeteer官方APIpuppeteer提供用于控制Chrome或Chromium的高级API。puppeteer的主要作用:利用网页生成PDF、图片爬取SPA应用、生成预渲染内容(即“SSR”服务器端渲染)的API,可用于自动化表单提交、UI测试、键盘通过抓取网站内容输入等:puppeteer.launch()启动浏览器实例browser.newPage()创建新页面page.goto()进入指定网页page.screenshot()截屏page.waitFor()等待页面,可以是时间,某个元素,某个函数page.$eval()获取指定元素,相当于document.querySelectorpage.$$eval()获取某类元素,相当于document.querySelectorAllpage.$('#id.className')获取文档中的一个元素,操作类似于jQuery代码示例constpuppeteer=require('puppeteer');(async()=>{constbrowser=awaitpuppeteer.launch();constpage=awaitbrowser.newPage();awaitpage.goto('https://example.com');awaitpage.screenshot({path:'example.png'});awaitbrowser.close();})();videofiledownloadmethoddownloadvideomainmethodconstdownloadVideo=asyncvideo=>{//判断视频文件是否已经下载if(!fs.existsSync(`${config.savePath}/${video.title}.mp4`)){awaitgetVideoData(video.src,'binary').then(fileData=>{console.log('正在下载视频:',video.title)savefileToPath(video.title,fileData).then(res=>console.log(`${res}:${video.title}`))})}else{console.log(`视频文件已经存在:${video.title}`)}}获取视频数据getVideoData(url,encoding){returnnewPromise((resolve,reject)=>{letreq=http.get(url,function(res){letresult=''encoding&&res.setEncoding(encoding)res.on('data',function(d){result+=d})res.on('end',function(){resolve(result)})res.on('error',function(e){reject(e)})})req.end()})}保存视频数据到localsavefileToPath(fileName,fileData){letfileFullName=`${config.savePath}/${fileName}.mp4`returnnewPromise((resolve,reject)=>{fs.writeFile(fileFullName,fileData,'binary',function(err){if(err){console.log('savefileToPatherror:',err)}resolve('downloaded')})})}抓取结果截图,本爬虫仅供个人学习使用,如有侵权,立即删除!