// superagent 是用来发起请求的,是一个轻量的,渐进式的ajax api,可读性好,学习曲线低,内部依赖nodejs原生的请求api,适用于nodejs环境下.,也可以使用http发起请求
// superagent-charset防止爬取下来的数据乱码,更改字符格式
// cheerio为服务器特别定制的,快速、灵活、实施的jQuery核心实现.。
const superagent = require("superagent");
const charset = require("superagent-charset");
charset(superagent);
const cheerio = require("cheerio");
const fs = require("fs");
/**
* 批量采集图片类
* @params String url 链接
* @params Number pageStart 起始页
* @params String charset 页面编码
* @params Number pageStep 步长
* @params Number pageTotal 总页面数
*/
class ReptilePic {
constructor(url, pageStart, charset, pageStep, pageTotal) {
this.url = url;
this.pageStart = pageStart || 1;
this.charset = charset || "utf8";
this.pageStep = pageStep || 1;
this.pageTotal = pageTotal || 1;
this.pageLists = []; //页面链接集合
this.picLists = []; //图片集合
this.init();
}
init() {
//1.生成列表页面link
this.getPageList();
//2.请求每个列表页面,生成图片list
//3.下载图片(校验目录+保存)
}
/**
* 生成列表页面link[]
* 匹配(*) 替换为动态页面中的变量 可以是0-9 a-z A-Z
* 后期加入循环多个变量 匹配功能
*/
getPageList() {
let reg = /\((\*)\)/g;
if (reg.test(this.url)) {
// console.log("11------------", RegExp.$1); //*
let len = parseInt(this.pageTotal / this.pageStep);
for (let i = this.pageStart; i <= len; i += this.pageStep) {
this.pageLists.push(this.url.replace(reg, i));
}
// console.log("pageList----------", this.pageLists);
console.log("生成列表list完成");
console.log("开始采集图片地址list");
this.getPicList(0);
}
}
//2.请求每个列表页面,生成图片list
getPicList(num) {
// this.pageLists
if (num > this.pageLists.length - 1) {
console.log("生成图片list完成");
console.log("开始下载图片");
this.downLoadPic(0);
return;
} else {
superagent
.get(this.pageLists[num])
.buffer(true)
.charset(this.charset)
.end((err, response) => {
if (err) throw err;
var $ = cheerio.load(response.text);
//采集规则(可提出来自定义)
$("div.g-main-bg ul.g-gxlist-imgbox li a").each((idx, element) => {
let $element = $(element);
let title = $(element).attr("title");
let imgSrc = $element.find("img").attr("src");
this.picLists.push({
title,
imgSrc,
});
});
console.log(`开始采集第${num + 1}页图片地址`);
num++;
this.getPicList(num);
});
}
}
//3.下载图片(校验目录+保存)
downLoadPic(index) {
//批量下载图片
//1.创建目录(后期自定义目录和文件名)
/* let dir = __dirname + "/imgs";
fs.mkdir(dir, { recursive: true }, (err) => {
if (err) throw err;
}); */
//2.下载 this.picLists = item index下标
if (index > this.picLists.length - 1) {
console.log("批量下载图片完成");
return;
} else {
let imgSrc = this.picLists[index].imgSrc;
let dir = __dirname + "/imgs";
let ws = fs.createWriteStream(
dir + `/${this.picLists[index].title}${index}.png`
); //这里为了省事,我就直接用下标命名了;
if (imgSrc.indexOf("http") !== -1) {
superagent(imgSrc).pipe(ws);
}
ws.on("finish", () => {
console.log(`${this.picLists[index].title}-----------下载完成`);
index++
this.downLoadPic(index)
});
}
}
}
let url = "https://www.qqtn.com/tx/weixintx_(*).html";
new ReptilePic(url, 1, "gb2312", 1, 4);