前言
老板:微信公众号要精简,把之前发的文章都删掉吧!
Maxmon:好的~
Maxmon:(万一之后文章又需要了,要是直接删了多可惜,偷偷地做个备份吧)
准备工作
看了下公众号,有直接删除文章的按钮,但好像没有保存已发布文章的地方,那怎么做存储呢?
想来想去,就想到了爬虫~
开始代码
const axios = require('axios'); // 网络请求
const fs = require('fs'); // 文件存储
const cheerio = require('cheerio'); // 解析HTML文件
/**
* 获取文章函数
*/
async function getArticle(articleUrl) {
console.log('articleUrl', articleUrl)
let a = await axios.get(articleUrl);
let data = a.data;
let $ = cheerio.load(data);
let title = $('#activity-name').text().replace(/[\s—|]/g,''); // 获取 微信文章-标题
let timeMatch = data.match(/var publish_time = "(.*?)\"/) // 获取 微信文章-发布时间
let time = '0000-00-00';
if (timeMatch) time = timeMatch[1] || time;
let imgs = $('img')
let fileName = `${time} ${title}`;
// 判断本地是否已经抓过这个页面,抓取过就跳过
if (fs.existsSync(`${fileName}.html`)) {
console.log(fileName, '已抓取 跳过')
return;
}
for (let i = 0; i < imgs.length; i++) {
let attribs = imgs[i].attribs;
let url = attribs['data-src'];
if (url) {
let imgType = attribs.type || 'jpeg';
if (!fs.existsSync(fileName)) {
fs.mkdirSync(fileName)
}
let locPath = `./${fileName}/${i}.${imgType}`
await getImg(url, locPath);
imgs[i].attribs.src = locPath;
}
}
fs.writeFileSync(`${fileName}.html`, $.html());
}
/**
* 获取图片等资源文件
*/
async function getImg(url, locPath) {
let b = await axios.get(url, {
responseType: "arraybuffer",
});
fs.writeFileSync(locPath, Buffer.from(b.data, 'base64'));
}
getArticle('https://mp.weixin.qq.com/s/p4It1825oDJSBUZsSax1cA');
小插叙
在抓取完所有网页之后,我大胆地删除了已发布的文章,大概
50
多篇呢,然后…
。。。。我发现,原来文章素材那里本来就是有备份的?
体验地址
- 最后成功抓取的页面
https://maxmon.top/blog/004/2019-05-21 世界家庭医生日携手家庭医生,共筑健康生活.html
https://maxmon.top/blog/004/2018-07-02 夏季防蚊小妙招,家有宝宝的一定要看哦!.html
项目地址
感谢
- 老板
- node、fs、axios、cheerio、微信
- 没有搞清楚微信公众号原理的自己