项目需求
使用NodeJS爬取指定网页上的图片,并将其保存在本地目录里。
实现思路
- 使用request第三方库来请求网页地址;
- 使用一个第三方库——cheerio.js来分析网页的DOM结构,得到图片的DOM,获取到图片地址。
- 使用fs模块将其保存到本地目录
项目目录
![d199d7838e8c7d31bab1660f63b2bc19.png](https://img-blog.csdnimg.cn/img_convert/d199d7838e8c7d31bab1660f63b2bc19.png)
- saveImg ——用来保存下载好的图片
- analyze.js——分析网页DOM,获取图片路径的逻辑
- config.js——包含网页地址,文件保存路径等项目配置
- index.js——包含请求网络,保存文件等逻辑
项目源码
- config.js
const
- analyze.js
const cheerio = require('cheerio');
const fs = require('fs');
const config = require('./config');
// 找到Img dom
function findImg(dom,callback) {
let $ = cheerio.load(dom);
$('img').each((index,dom)=>{
let imgSrc = $(dom).attr('src');
callback(imgSrc,index);
})
}
module.exports = {
findImg
}
- index.js
const http = require('http');
const fs = require('fs');
const request = require('request');
const path = require('path');
const config = require('./config');
const analyze = require('./analyze');
/***
*
* 开始网络请求
*/
function start() {
request(config.url, (err, res, body) => {
console.log('start spider');
if (!err && res) {
console.log('beginning');
analyze.findImg(body, saveImgFile);
}
})
}
// 保存文件
function saveImgFile(src, index) {
let ext = src.split('.').pop();
let imgName = src.split('.')[0].split('/').pop();
src = config.url + src;//具体项目具体拼接
http.get(src, (res) => {
let imgData = "";
res.setEncoding("binary");
res.on("data", function (chunk) {
imgData += chunk;
});
res.on("end", function () {
if (imgData) {
let filePath = config.filePath +'/'+ imgName +'.'+ext;
fs.writeFile(filePath, imgData, "binary", function (err) {
if (err) {
console.log("down fail");
}
console.log("down success");
});
} else {
console.log('下载失败!,图片路径不存在!');
}
});
})
}
start();
项目地址及使用方法
- 项目地址
github地址: https:// github.com/Hutingtang/n ode_spider_img.git
- 使用方法
git clone https://github.com/Hutingtang/node_spider_img.git
npm install
npm start // 或是 node ./index.js
最后
这个项目是因为自己想写一个仿站项目,但是图片资源没有,所以只能爬取网页自己的图片资源了。项目bug很多,但是基本功能是实现了的,把代码和git地址发出来供大家相互学习吧