使用node爬取网页上的图片,并保存在本地目录

3,015 阅读1分钟

项目需求

使用NodeJS爬取指定网页上的图片,并将其保存在本地目录里。

实现思路

  • 使用request第三方库来请求网页地址;
  • 使用一个第三方库——cheerio.js来分析网页的DOM结构,得到图片的DOM,获取到图片地址;
  • 使用fs模块将其保存到本地目录。

项目目录

项目结构图

  • saveImg ——用来保存下载好的图片
  • analyze.js——分析网页DOM,获取图片路径的逻辑
  • config.js——包含网页地址,文件保存路径等项目配置
  • index.js——包含请求网络,保存文件等逻辑

项目源码

  • config.js
const url = 'https://unsplash.com/photos/RDDYS5DFo08';
const path = require('path');
const filePath = path.join(__dirname,'saveImg');
module.exports = {
 url,
 filePath
} 
  • 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();

项目地址及使用方法

  • 使用方法
git clone https://github.com/Hutingtang/node_spider_img.git
npm install
npm start // 或是 node ./index.js

最后

这个项目是因为自己想写一个仿站项目,但是图片资源没有,所以只能爬取网页自己的图片资源了。项目bug很多,但是基本功能是实现了的,把代码和git地址发出来供大家相互学习吧。