使用node.js从网站下载图像

问题描述:

我试图使用节点脚本下载网站上的每个图像。使用node.js从网站下载图像

我写了它,大部分它似乎工作,但是,它只是下载第一张图片。它下载它等于网站上的图像数量。

这是我的代码。

const http = require('http'), 
cheerio = require('cheerio'), 
fs = require('fs'); 
var document = ''; 
var imageData = ''; 
http.get('http://www.wikihow.com/Start-a-Blog', function(res){ 
    res.on('data', function(chunk){ 
     document+=chunk; 
    }) 
res.on('end', function(){ 
    let $ = cheerio.load(document); 
    var array = []; 
    var array = $("img").toArray(); 
    var data = []; 
    array.forEach(function (ele) { 
     if (ele.attribs.src !== undefined) 
     data.push(ele.attribs.src); 
    }) 
    var counter = 0; 
    data.forEach(function (ele) { 
     ripImage(ele, counter); 
     counter ++; 
    }) 
}) 
}); 

function ripImage(ele, counter){ 

http.get(ele, function(res){ 
    console.log(res); 
    res.setEncoding('binary') 
    res.on('data', function(chunk){ 
     imageData += chunk; 
    }) 
    res.on('end', function(){ 
     //console.log(ele); 
      fs.writeFile("dump/file" + counter + ".jpg", imageData, 'binary', function(err){ 
      if (err) throw err 
      //console.log('File saved.') 
     }); 
    //res.pipe(file); 
    }) 
}); 
} 

我认为问题出在ripImage()函数的某处。如果你们能看到这个问题,并帮我解决这个问题,那会非常感激。

谢谢你们。

+0

您可以使用异步队列,cheerio和请求。我不明白你为什么使用http请求的低执行。一个队列和一个两个功能可能会更简单。 – Gntem

+0

我试图尽可能少地利用资源来学习更多的东西。我对Node还比较陌生,所以我只是掌握了一些东西。 – Gwinert

@Phoenix先生是对的,异步库是为了这种类型的东西。它允许您使用异步函数遍历集合,并在所有异步函数完成时触发回调。工作代码:

const http = require('http') 
const cheerio = require('cheerio') 
const fs = require('fs') 
const async = require('async') 

let document = '' 

http.get('http://www.wikihow.com/Start-a-Blog', (res) => { 
    res.on('data', (chunk) => { 
    document += chunk 
    }) 

    res.on('end',() => { 
    const $ = cheerio.load(document) 

    const data = $('img') 
     .toArray() 
     .filter((ele) => ele.attribs.src) 
     .map((ele) => ele.attribs.src) 

    async.eachOf(data, ripImage, (err) => { 
     if (err) throw err 
     console.log('all done!') 
    }) 
    }) 
}) 

function ripImage (ele, i, callback) { 
    http.get(ele, (res) => { 
    let imageData = '' 

    res.setEncoding('binary') 

    res.on('data', (chunk) => { 
     imageData += chunk 
    }) 

    res.on('end',() => { 
     fs.writeFile('./dump/file' + i + '.jpg', imageData, 'binary', callback) 
    }) 
    }) 
}