使用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()函数的某处。如果你们能看到这个问题,并帮我解决这个问题,那会非常感激。
谢谢你们。
答
@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)
})
})
}
您可以使用异步队列,cheerio和请求。我不明白你为什么使用http请求的低执行。一个队列和一个两个功能可能会更简单。 – Gntem
我试图尽可能少地利用资源来学习更多的东西。我对Node还比较陌生,所以我只是掌握了一些东西。 – Gwinert