用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);
      });
    });
  });
}