Node.js 从网页下载图片并替换为新地址

版权声明:本文为博主原创文章,欢迎转载,转载时请以超链接形式标明文章原始出处。 https://blog.csdn.net/lilongsy/article/details/84346187

平常经常需要保存网页上的图片,如果一张一张地保存会非常麻烦和浪费时间,为了解决这个问题,我写了一个node.js的脚本,可以直接用node命令就可以把网页里的图片下载到本地,另外还可以扩展为下载其他资源,如cssjsvideo等。

var data = `
<!DOCTYPE html>
<html>
<head>
<title></title>
<body>
<div id="content">
<img src="https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png"/>
</div>
</body>
</html>

`;
const cheerio = require('cheerio');
const request = require('request');
const fs = require('fs');
const path = require('path')
const moment = require('moment')
const md5=require('md5-node');

let $ = cheerio.load(data);
$('#content img').each(function(i, ele){
    // 图片地址
    let src = $(this).attr('src');
    console.log(src);
    let fn = filename(src)
    download(src, "./imgs", fn);
    // 设置为新的地址
    $(this).attr('src', "/imgs/"+ fn);
    console.log($.html('#content'));
});

// md5文件地址,防止重复下载
function filename(src) {
    // 扩展名
    let type = path.extname(src);
    // 一天内的地址不重复下载
    let dt = moment().format('YYYY-MM-DD');
    return md5(src + dt) + '.' + type;
}

// 递归创建目录
function mkdir(dirname) {
    if (fs.existsSync(dirname)) {
        return true;
    } else {
        if (mkdir(path.dirname(dirname))) {
            fs.mkdirSync(dirname);
            return true;
        }
    }
    return false;
}

// 下载文件到指定目录
function download(uri, dir, filename) { 
    request.head(uri, function(err, res, body){
        if(mkdir(dir)) {
            request(uri).pipe(fs.createWriteStream(dir+"/"+filename));
        }
    }); 
}

猜你喜欢

转载自blog.csdn.net/lilongsy/article/details/84346187