如何通过程序自动抓取微信公众号文章的内容和视频

如何通过程序自动抓取微信公众号文章的内容和视频

点点

2021-03-30 20:31 阅读 1040 喜欢 0

微信公众号文章里的视频怎么下载

如果只是针对一个文章的话是很简单的,直接通过复制文章地址 ,在谷歌浏览器打开后,然后在视频右下角点击全屏,点击右下角的点点点,点击下载即可。

当然也可以通过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


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
爬虫与反爬一直在不停的斗争,手段层次不穷。字体反爬算是常见的一种手段,大抵的思路是通过字体文件将浏览器渲染结合起来,让浏览器看到的内容与肉眼看到的内容不一致,达成一定的反爬目的。
手机微信朋友圈中经常会看到很多好友都是只发文字不发图片,但是很多小伙伴们在发朋友圈的时候不知道微信朋友圈怎么发文字不发图片,不知道具体怎么操作?
当小伙伴给电脑设置了密码,因为各种原因小伙伴们可能会忘记自己的电脑开机密码,在最新的windows10系统中忘记密码怎么办呢?这里为各位小伙伴带来分享,看一下开机密码忘记之后的解决办法,如何强制重置。
相信小伙伴们都有发生过这样的事情,由于群聊消息太多,于是就习惯性的把聊天窗口给关闭了,但是在关闭之前却忘记了将群保存到通讯录里,在次想入群聊天的时候,却怎么也无法找到入口了,除非是有人在群里发消息,只有这样才可以看到群聊,真的是太难受了。
苹果手机相册的照片怎么删除不了?为什么苹果手机相册里的照片无法删除?
易用、简洁且高效的http库
鉴于当下聊天记录越来越重要,很多的小程序都有保留聊天记录的功能,抖音现在是很火的软件,那么抖音中的聊天功能就显得非常重要,因为可以分享自己喜欢视频给对方,然后可以在其中进行聊天,将会带来非常有趣的沟通过程,但是很多小伙伴们问小编,发现抖音聊天记录突然没有了想要知道怎么恢复。
微信怎么设置主题背景?很多小伙伴们长时间的使用微信会觉得微信的界面和主题会有一点的单调,想要丰富一下自己的微信界面,但是很多小伙伴不知道微信怎么设置主题背景?那么下面就让点点给小伙伴们介绍一下。