node爬取页面内容和图片存到本地

// fs模块   功能 读写  追加 文件夹
const fs = require('fs');
// 解析html  功能强大   爬虫必备 像jquery一样的用法
const cheerio = require('cheerio');
// 发起请求 可以用与接收文件流
const request = require('request');
// 建立一个简易服务器
const https = require('https');

// 要爬取的目标url
const url = 'https://www.jiemian.com/lists/31.html';

let a = 0;
https.get(url, res => {
  let html = '';
  // 设置编码格式,防止获取到的html乱码
  res.setEncoding('utf-8');
  // 数据到达
  res.on('data', chunk => {
    html+=chunk;
  })
  // 请求体数据完毕
  res.on('end', () => {
    const $ = cheerio.load(html);
    saveText($);
  })
  // close 当前的请求结束
}).on('error', err => {
  console.log(err);
});

// 内容处理
function saveText ($) {
  // 获取当前页面的所有的列表的数据
  const item = $('.list-view .news-view')[a];
  // 获取标题的内容
  const tit = $(item).find('.news-header a').text().trim();
  // 获取图片的地址
  const src = $(item).find('.news-img img').attr('src');
  fs.mkdir(`./content/${tit}`, error => {
    if (!error) {
      fs.appendFile(`./content/${tit}/main.txt`, `{tit: ${tit}}`, error => {
        if (error) {
          console.log('创建失败!')
        }
      })
      saveImg(tit, src, $);  // ------------1
    } else {
      saveText($);
      a++;
    }
  })
}

// 图片处理
function saveImg (tit, src, $) {
  // createWriteStream 创建一个可读的文件流
  let writeStream = fs.createWriteStream(`./content/${tit}/${a}.jpg`);
  // 获取当前图片的信息
  let readStream = request(src);
  //写入对应的文件夹中
  readStream.pipe(writeStream);
  // // 监听本次写入是否结束
  readStream.on('end', response => {
    a++;
    if (a <= $('.list-view .news-view').length - 1) {
      saveText($)
    } else {
      console.log('读取完成!')
    }
    writeStream.end();
  })
}

对于图片处理部分,saveImg里面的代码块放在-------1的地方时总是会报错 pipe未处理的错误流 不知道是什么问题导致的 然后按照我现在的写法完全ok 欢迎提问讨论

你可能感兴趣的:(nodejs,js)