有的时候我们浏览一些网站,主要是为了看里面的图片,但是这样会存在几个问题
- 网速不给力的情况下怎么办?
- 来回切换网页,感觉好辛苦
有没有更好的办法,比如批量下载到本地,然后查看?
答案是肯定的,今天我们就一起来学习如何批量下载图片
主要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 文件夹, 然后就可以慢慢看啦。