//导入require包
let http = require("http");
let fs = require("fs");
let path = require("path");
let cheerio = require("cheerio");
let iconv = require("iconv-lite");
//爬虫指定网站的所有html源码
http.get("http://www.27270.com/ent/meinvtupian/", (response) => {
let chunks = []
response.on("data", (chunk) => {
//将读到的每一份数据存到一个数组中
chunks.push(chunk)
})
response.on("end", () => {
// 对数据重新进行编解码
var htmlTar = iconv.decode(Buffer.concat(chunks), 'gb2312');
//自定义一个解析页面并获取图片资源的方法
let result = parseHtml(htmlTar);
//自定义一个下载图片的方法
download(result)
})
})
//解析源码,并获取所要下载的图片放到一个数组中
function parseHtml(htmlTar) {
//加载爬虫下来的html源码
let $ = cheerio.load(htmlTar);
let result = []
//将自己想要的某种类型的图片转成一个数组
let imgArr = $("div.MeinvTuPianBox>ul>li>a>i>img").toArray();
imgArr.forEach(img => {
//遍历数组,并获取其src和alt属性
let imgSrc = $(img).attr("src");
let imgAlt = $(img).attr("alt");
result.push({//将src和alt属性封装成一个对象{},并存入数组中
imgSrc,
imgAlt
})
})
return result
}
//下载数组中的图片
function download(result) {
//自定义一个下载目录
let dir = "imgs"
for (let i = 0; i < result.length; i++) {
//遍历数组中的每个对象,获取src和alt属性
let downpath = result[i].imgSrc
let filename = result[i].imgAlt
http.get(downpath, (response) => {
//对每个对象进行下载操作,http.get()方法用来获取下载图片的请求
let extname = path.extname(downpath);//获取图片后缀
let filepath = path.join(dir, filename + extname)//拼接下载的图片到本地的完整路径
let writeStream = fs.createWriteStream(filepath);//根据完整路径创建一个写入流
response.pipe(writeStream)//利用pipe方法,之类response就是一个读入流
})
}
}
网友评论