nodeはページの内容と画像をローカルに保存します

1924 ワード

// 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です.质问を歓迎します.