2017-04-26 125 views
-2

我試圖使用節點腳本下載網站上的每個圖像。使用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

回答

0

@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) 
    }) 
    }) 
}