Node.js 從網頁下載圖片並替換為新地址
阿新 • • 發佈:2018-12-03
平常經常需要儲存網頁上的圖片,如果一張一張地儲存會非常麻煩和浪費時間,為了解決這個問題,我寫了一個node.js
的指令碼,可以直接用node命令就可以把網頁裡的圖片下載到本地,另外還可以擴充套件為下載其他資源,如css
、js
、video
等。
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));
}
});
}