使用node批量抓取并保存图片

 

有的时候我们浏览一些网站,主要是为了看里面的图片,但是这样会存在几个问题

  1. 网速不给力的情况下怎么办?
  2. 来回切换网页,感觉好辛苦

有没有更好的办法,比如批量下载到本地,然后查看?

答案是肯定的,今天我们就一起来学习如何批量下载图片

主要node工具

cheerio 和 superagent 和 request

superagent 的作用主要是用node访问http页面

cheerio 主要是作用类似浏览器中的jquery

request 请求图片, 最后用fs.createWriteStream 保存到本地

开始

首先装一个 node + express-generator

然后用 expres 命令行 生成一个 简单的node 网站

大概的目录

然后打开 routers 下的index 文件,改写,最终变成:

var express = require('express');
var router = express.Router();
const cheerio = require('cheerio');
const superagent = require('superagent');
const Throttle    = require('superagent-throttle')
const fs = require('fs');
const Ut  = require('./saveImg');
let throttle = new Throttle({
    active: true,     // set false to pause queue
    rate: 6,          // how many requests can be sent every `ratePer`
    ratePer: 10000,   // number of ms in which `rate` requests may be sent
    concurrent: 2     // how many requests can be sent concurrently
})
    .on('sent', (request) => {
        "use strict";

    }) // sent a request
    .on('received', (request) => {
        "use strict";
        console.log('开始请求' + request.url)
    })
    .on('drained', () => {
        "use strict";
        console.log('请求完成')
    })
/* GET home page. */
/*
router.get('/', function (req, res, next) {

    res.render('index', {title: 'Express'});
});
*/
let getSonPage = (list)=>{
    "use strict";
    list.forEach((item, index) =>{
        let url = item.href;
        superagent.get(url).use(throttle.plugin()).end((err, res) =>{
            if(err){
                throw Error(err);
                return;
            }
            let $ = cheerio.load(res.text);
            $('.content_left p').each(function(i, elem) {
                let _this = $(elem),
                    obj = {
                        url: _this.find('img').attr('src')
                    },
                    path = __dirname + '/image/rosi_' + index +  i  + '.jpg';
                obj.url && Ut.downImg(obj, path);
            });
        });
    });
};
router.get('/', function (req,res,next) {
    const reptileUrl = "http://www.meisiguan.cc/tag/rosi";
    superagent.get(reptileUrl).end(function (err, res) {
        // 抛错拦截
        if(err){
            throw Error(err);
            return;
        }

        let $ = cheerio.load(res.text);
        let data = [];
        // 下面就是和jQuery一样获取元素,遍历,组装我们需要数据,添加到数组里面
        $('#index_ajax_list li').each(function(i, elem) {
            let _this = $(elem);
            data.push({
                img: _this.find('img').attr('src'),
                title: _this.find('img').attr('alt'),
                href: _this.find('a').attr('href')
            });
        });
        getSonPage(data);
    });
})
module.exports = router;

然后把下载图片封装成一个文件 saveImg.js

let request = require("request");
let fs = require("fs");

class Ut {
    /**
     * 下载网络图片
     * @param {object} opts
     */
    static downImg(opts = {}, path = '') {
        return new Promise((resolve, reject) => {
            request
                .get(opts)
                .on('response', (response) => {
                    console.log("img type:", response.headers['content-type'])
                })
                .pipe(fs.createWriteStream(path))
                .on("error", (e) => {
                    console.log("pipe error", e);
                    resolve('');
                })
                .on("finish", () => {
                    console.log("下载完成");
                    resolve("ok");
                })
                .on("close", () => {
                    console.log("关闭");
                })

        })
    };
}

module.exports = Ut;

npm start 后 打开本地的 localhost:3000 就静静的等待 结果把

运行完成后 找到 routes/image 文件夹, 然后就可以慢慢看啦。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论