如果只是针对一个文章的话是很简单的,直接通过复制文章地址 ,在谷歌浏览器打开后,然后在视频右下角点击全屏,点击右下角的点点点,点击下载即可。
当然也可以通过F12来查看video标签或查看network数据请求。
这些都是一些基本的操作了,下边主要是通过puppeteer来获取视频并下载。
之前通过puppeteer其实已经做过很多事情了,登录啊 签到啊 等等.因为总体来说没有什么技术含量的,目前主要是做个铺垫,后续研究下如何抓取所有公众号的所有文章。
直接上代码
/**
const puppeteer = require('puppeteer'); const path = require('path'); const fs = require('fs'); const helper = require('think-helper');//创建目录api const axios = require('axios'); const folder = __dirname;
let url = https://mp.weixin.qq.com/s/fwY6FPFCfgdJNTd22qqjKg
;
// let url = https://mp.weixin.qq.com/s?__biz=MjM5MDAwNTk0MA==&mid=2653094471&idx=1&sn=8f430a2f1764714815ee9f523091b88b
;
function wsf(rs,ws){ return new Promise((r,j)=>{ rs.pipe(ws); ws.on('close',e=>{ r(); }) }); }
(async function(){
let browser = await puppeteer.launch({
headless : true,
executablePath : 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
});
console.log(`开启新页面:[${url}]`);
const page = await browser.newPage();
let asyncArr = [];
page.on('response',async (res)=>{
try{
let json = await res.json();//
if(json && json.url_info){
console.log(`获取到异步视频数据.`);
asyncArr = asyncArr.concat(json.url_info);
}
}catch(e){}
})
console.log(`等待页面数据请求加载完成。`)
await page.goto(url,{
waitUntil : 'networkidle2'//请求结束
});
//url
let videoArr = await page.evaluate(()=>{
return $('video').get().map(t=>{
return $(t).attr('src');
})
});
//获取公众号信息
let name = await page.evaluate(()=>{
return $('.account_nickname_inner').length > 0 ? $('.account_nickname_inner').text() : $('.rich_media_meta_nickname #js_name').text();
});
let title = await page.evaluate(()=>{
return $('.common_share_title').length > 0 ? $('.common_share_title').text() : $('.rich_media_title').text();
});
name = name.trim();
title = title.trim();
console.log(`获取到公众号信息:[${name}-${title}]`)
//创建目录
let folderPath = path.join(folder,name,title);
helper.mkdir(folderPath);//创建目录
//对视频做处理。
let vr = [];
vr =vr.concat(videoArr.map(t=>{
let u = new URL(t);
let fileName = title+path.extname(u.pathname);
let filePath = path.join(folderPath,fileName);
return {
title : fileName,
filePath : filePath,
url : t
}
}));
vr = vr.concat(asyncArr.map(t=>{
let u = new URL(t.url);
let fileName = t.video_quality_wording +'-'+ title+path.extname(u.pathname);
let filePath = path.join(folderPath,fileName);
return {
title : fileName,
filePath : filePath,
url : t.url
}
}));
console.log(`开始准备下载视频文件`);
for(let video of vr){
console.log(`开始下载视频:[${video.title}]`)
await axios.get(video.url,{
responseType : 'stream'
}).then(async rs=>{
await wsf(rs.data,fs.createWriteStream(video.filePath));
})
}
//将页面滚动到最底部
await page.evaluate(()=>{
$('html').get(0).scrollTop = $('html').get(0).scrollHeight
});
console.log('等待资源加载.....')
// await page.evaluate(function(){
// let timeLimit = 60 * 1000;
// return new Promise((r,j)=>{
// let isLoaded = true;
// let start = +new Date();
// let t = setInterval(function(){
// $('img').get().forEach(t=>{
// var img = $(t).attr('src');
// var pimg = $(t).data('src');
// if(img.indexOf(pimg) > -1){
// isLoaded = isLoaded && true;
// }else{
// isLoaded = isLoaded && false;
// }
// })
// if(isLoaded || (+new Date()) - start > timeLimit){
// clearInterval(t);
// r();
// }
// },500);
// })
// });
//pdf
console.log(`保存文章到PDF`)
await page.pdf({
path : path.join(folder,name,title,title+'.pdf'),
format : 'A4',
printBackground : true
});
console.log(`关闭浏览器`);
await browser.close();
process.exit(0);
})(); 相对来说没有什么难度。不过也碰到了一个问题,资源懒加载的问题。
转载请注明出处: http://sdxlp.cn/article/weixingongzhonghao.html