本文使用nodejs爬取网页的写真图片,爬取图片仅为学术研究练习所用,爬取数据做了限制并未进行大批量破坏服务器的暴力请求爬取!
以下代码仅是练习分享,还请不要随意大批量爬取网站图片。如有其他破坏行为均已本文无关。
爬取到错误的图片,会打印错误信息并删除该错误图片
核心代码如下:(只有图片下载片段代码)
const imgDownLoad = async (imgUrlArr) => {
const promiseStateArr = await imgUrlArr.map(async item => {
try {
const response = await axios.get(item, { responseType: 'stream' });
const imagePath = path.join(__dirname, `./download/${path.basename(item)}`);
const imageStream = fs.createWriteStream(imagePath);
response.data.pipe(imageStream);
return new Promise((resolve, reject) => {
imageStream.on("finish", () => {
console.log(`下载完成:${path.basename(item)}`);
resolve(); // 下载完成时,resolve Promise
});
imageStream.on("error", (err) => {
console.error(`下载失败:${path.basename(item)}`, err);
fs.unlinkSync(imagePath); // 删除下载失败的文件
reject(err); // 下载出错时,reject Promise
});
});
} catch (err) {
console.error(`下载错误:${path.basename(item)}`, err);
// 如果下载出错,直接跳过该图片继续下载下一个图片
return Promise.resolve();
}
});
return Promise.all(promiseStateArr);
};
- 思路:
- 传入用户输入的关键字 进行页面请求
-
/将得到的网页源码 进行传入 进一步进行解析
-
返回所有的详情页跳转地址
-
拿到详情页的图片数据 拿到所有的图片地址
-
遍历 图片地址 发起图片资源请求
-
将请求资源利用管道进行写入到文件夹