笨笨家的唯一 发表于 2021-11-25 14:44

nodejs的小应用-批量顺序保存微信文章图片

本帖最后由 笨笨家的唯一 于 2021-11-25 14:49 编辑

有些时候在微信中找到了一些图片资源,想都按顺序保存下来,但是吧,又懒得一个个的保存或者提取缓存,就搞了一个这个,保存的时候是按照图片出现的顺序来命名保存的,应该也算是一个爬虫吧{:301_1008:}
主要添加了 async包,用来控制并发数。默认保存在当前目录下的 weixinimg 文件夹中const cheerio = require("cheerio");
const axios = require("axios");
const fs = require("fs");
const async = require("async");
const path = require("path");
const downloadImg = (url, paths) => {
    return new Promise((resolve, reject) => {
      let config = {
            headers: {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36",
            },
            responseType: "stream",
      };
      let res = axios.get(url, config);
      res.then(respone => {
            let fsw = fs.createWriteStream(paths);
            respone.data.pipe(fsw);
            fsw.on("close", () => {
                resolve(`${path.basename(paths)}保存完毕!`);
            });
      });
      res.catch(err => {
            console.log("no such file!");
            reject(0);
      });
    });
};

const baseurl = "https://mp.weixin.qq.com/s/8gkCrpbP3pitfQN2L9FTBA";//*****这里改成自己需要的内容*****
let result = {
    pathNames: [],
    urls: [],
};
axios
    .get(baseurl, {
      headers: {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36",
      },
    })
    .then(res => {
      let $ = cheerio.load(res.data);
      $("img.rich_pages").each((i, value) => {
            result.pathNames.push("./weixinimg/" + i + "." + $(value).attr("data-type"));
            result.urls.push($(value).attr("data-src"));
      });
      async.mapLimit(result.urls, 20, imgFun, allImgFun);
    });

function imgFun(url, callback) {
    let index = result.urls.indexOf(url);

    downloadImg(url, result.pathNames)
      .then(res => {
            console.log(res);
            callback(null, null);
      })
      .catch(err => {
            console.log("no such file");
            callback(null, null);
      });
}

function allImgFun(err, resultes) {
    console.log("图片保存在 weixingimg 文件夹下,请注意检查!");
}
才疏学浅,有不对的还希望大家批评指正

unmask 发表于 2021-11-25 23:21

思路非常好。
说一点锦上添花的建议,pathName和url封装成一个object后缓存到result,然后在imgFun的回调中消费每个object,就会减少好多index的计算。
最后,建议多用用es6的语法,比如map,reduce,lambda等,

笨笨家的唯一 发表于 2021-11-26 08:43

unmask 发表于 2021-11-25 23:21
思路非常好。
说一点锦上添花的建议,pathName和url封装成一个object后缓存到result,然后在imgFun的回调 ...

才开始学nodejs,很多都不会{:301_1005:}

arley 发表于 2021-11-26 09:10

不错周末有空拿来试试

2titanic 发表于 2022-3-8 08:39

楼主,有成型的exe吗?正需要这东东,谢谢!

slslsl 发表于 2022-3-8 12:13

思路挺好的,就是看实现有很多重复代码,可以整合精简一下

笨笨家的唯一 发表于 2022-3-14 10:13

2titanic 发表于 2022-3-8 08:39
楼主,有成型的exe吗?正需要这东东,谢谢!

初学者,不会打包{:301_973:}

jelin 发表于 2022-8-4 09:08

正在学习nodejs,研究一下,感谢分享。

liang8210 发表于 2022-9-14 17:11

这个可以批量下载微信中合并转发的图片吗?

笨笨家的唯一 发表于 2022-9-16 11:26

liang8210 发表于 2022-9-14 17:11
这个可以批量下载微信中合并转发的图片吗?

这个下载的是微信公众号文章中的图片,你说的合并转发的是不是聊天记录图片啊?
页: [1]
查看完整版本: nodejs的小应用-批量顺序保存微信文章图片