直接上代码:
//通过npm引入对应依赖
//不同协议引用不同模块,http https
const http = require('http')
const https = require('https')
const fs = require('fs')
const cheerio = require('cheerio')
let url = 'http://www.bbsnet.com' //网站地址
const saveFoldersPath = './images' //储存文件的文件夹地址
http.get(url, (res) => {
//安全判断
const {
statusCode
} = res //状态码
const contentType = res.headers['content-type'] //数据类型
let err = null
if (statusCode !== 200) {
err = new Error('请求状态错误' + statusCode)
} else if (!/^text\/html/.test(contentType)) {
err = new Error('请求类型错误' + contentType)
}
if (err) {
console.log(err)
res.resume() //清空缓存
return false
}
// 判断images文件夹是否存在
fs.exists(saveFoldersPath, (cb) => {
!cb && fs.mkdir(saveFoldersPath, () => {})
})
//数据处理
//数据分段,只要接受到数据就会触发data事件, chunk 每次接受的数据片段
let rawData = ''
res.on('data', (chunk) => {
rawData += chunk.toString('utf-8') //使用utf-8的格式转码
})
//数据流传输完毕
res.on('end', () => {
//将请求的数据保存到本地
let $ = cheerio.load(rawData) //使用jq的写法
$('img').each((index, item) => {
// console.log('item',$(item).attr('alt'))
let name = ($(item).attr('alt') ? $(item).attr('alt') : index) + '.png'
saveImg($(item).attr('src'), name)
})
console.log('数据传输完毕');
})
}).on('error', (err) => {
console.log('请求错误');
})
//保存图片到本地
function saveImg(url, name) {
// console.log(url, name)
try {
http.get(url, function(req, res) {
var imgData = '';
req.setEncoding('binary');
req.on('data', function(chunk) {
imgData += chunk;
})
req.on('end', function() {
fs.writeFile(`${saveFoldersPath}/${name}`, imgData, 'binary', function(err) {
console.log('保存图片成功' + name)
})
})
})
} catch (err) {
}
}