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

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

点点

2021-03-30 20:31 阅读 1261 喜欢 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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
手机已经成为我们必备的生活工具,如果遇到需要将几张图片拼合在一起的情况时,用手机应该使用什么应用可以达到效果呢,怎么把几张图片拼合成一张照片呢,具体该怎么操作,下面就和小编一起来看看吧!
微信中打开Word、Excel等文档,会保存在一个目录下。但是,微信把这个目录隐藏很深,路径不易记住,所以,我把这个路径记下来。 在安卓系统中可以安装ES文件浏览器来获得。如果找不到这个路径,或者显示为空,也可以转发到另一台安卓机上的微信号,在那台打开后再保存下来。
当我们使用手机微信办公、学习下载需要的文件时,下载的文件会存储在什么位置呢,如何在手机文件管理中找到下载的文件存储位置,下面就和小编一起来看看吧!
微信收款码是分为个人码和商家码两种,虽然看似差不多,但其实功能上是有差别的。商家收款码不仅支持顾客使用信用卡支付,还可以享受直接提现等便利功能。那么微信商家收款码怎么申请?第一步商户需要开通微信收款商业版。
很多使用Mac苹果电脑的小伙伴们,发现电脑中的照片太多了,因此想要清除不想要的照片,但是却不知道如何清除,那么小编就来为小伙伴们介绍一下吧。
这几天很多小伙伴们私信点点,问点点这个问题,今天点点就给小伙伴们写了一篇关于安卓系统和苹果系统怎么查看微信撤回消息的文章,希望小伙伴们喜欢,不过好奇害死猫啊!要慎重的去看这个事情。
近期很多小伙伴们给小编私信,问这些个问题,今天,小编给小伙伴们介绍同步电脑版和手机版微信的聊天记录的方法,希望对小伙伴们有所帮助。
为实现华为手机与电脑的文件传输与共享,以下需要在手机和电脑上所做的设置是一次性的,在最初使用前设置好即可,以后使用时无需再次设置。