用nodejs爬虫台湾痞客邦相册
情景:是这样的,我想保存一些喜欢的小伙伴的照片,一张张保存太慢了, 所以我写了个js,放在国外服务器爬,国内的自己解决~
使用方法
1.点相册随便一张, 复制url, 这张开始接下来的图片都会保存
/**
* 2023年10月23日 22:58:44
* 支持解析痞客邦相册
* 只需要复制相册第一张图片的url就行* *
* */
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
const path = require('path');
const https = require('https');
let i = 0 //计算照片数量
// 示例用法 替换为您要解析的相册地址第一张图
let url = 'https://用户id.pixnet.net/album/photo/100898948#after=100899621'
//默认延迟时间, 爬太快我怕出问题
let delay = 3000
//获取图片和下一个网页函数
async function parseImgTags(url) {
try {
const response = await axios.get(url);
const html = response.data;
const $ = cheerio.load(html);
++i;
let src = $('#item-frame-img').attr('src')
console.log(`解析到第${i}张图片`, src);
let nextlink = $('.item-frame .photolink').attr('href')
console.log('结果是,', nextlink)
//解析到然后保存本地
await saveImageToLocal(src)
setTimeout(() => {
parseImgTags(nextlink)
}, delay);
return nextlink
} catch (e) {
console.log('出了点问题')
return ''
}
}
//调用函数
parseImgTags(url)
.then(nextlink => {
console.log('有下一个', nextlink)
return
})
.catch(error => {
console.error('Error:', error);
});
async function saveImageToLocal(imageUrl) {
// 获取图片文件名
const filename = path.basename(imageUrl);
// 检查目录是否存在,如果不存在则创建
const dir = path.join('.', 'image');
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
// 构造本地文件路径
const localPath = path.join(dir, filename);
// 下载图片并保存到本地文件系统中
const file = fs.createWriteStream(localPath);
return new Promise((resolve, reject) => {
https.get(imageUrl, response => {
response.pipe(file);
file.on('finish', () => {
file.close(resolve);
});
}).on('error', error => {
fs.unlink(localPath, () => {
reject(error.message);
});
});
});
}