使用 URL 从 CSV 扫描通过节点请求下载图像
Download Image with Node-Request with URL scan from CSV
代码乱七八糟,请见谅。我还在学习。
我需要从 CSV 文件下载带有 URL 扫描的图像。但是我有 2000 多个 URL 具有相同的域,而且我不认为服务器会让我把所有东西都拉出来,因此我总是在一些图像后出错。我需要解决的问题 -
1) 如何确保图像完全下载,然后只有代码移动到下一个 URL
2) 如何编写更好的代码
感谢您的帮助。谢谢
var csv = require('fast-csv');
var Promise = require('bluebird');
var fs = require('fs');
var request = require('request');
var path = "test.csv";
var promiseCSV = Promise.method(function(path, options) {
return new Promise(function(resolve, reject) {
var records = [];
csv
.fromPath(path, options)
.on('data', function(record) {
records.push(record);
})
.on('end', function() {
resolve(records);
console.log('done');
});
});
});
var download = function(uri, filename, callback){
request.head(uri, function(err, res, body){
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
promiseCSV(path).then(function (records) {
for(i=0;i<records.length;i++)
{
download(records[i][0],'img/'+records[i][1], function(){
});
}
});
这会将您的请求限制为一次一个。另一种选择是使用 throttled-request 来限制单位时间内的请求数。
var i = 0;
promiseCSV(path).then(function (records) {
next();
function next(){
download(records[i][0],'img/'+records[i][1], function(){
i++;
if (i < records.length) next();
});
}
});
此外,您的 records 变量超出范围,您需要将其移出才能访问它:
var records = []; // move out to global scope to access from elsewhere
var promiseCSV = Promise.method(function(path, options) {
return new Promise(function(resolve, reject) {
csv
.fromPath(path, options)
.on('data', function(record) {
records.push(record);
})
.on('end', function() {
resolve(records);
console.log('done');
});
});
});
代码乱七八糟,请见谅。我还在学习。
我需要从 CSV 文件下载带有 URL 扫描的图像。但是我有 2000 多个 URL 具有相同的域,而且我不认为服务器会让我把所有东西都拉出来,因此我总是在一些图像后出错。我需要解决的问题 -
1) 如何确保图像完全下载,然后只有代码移动到下一个 URL
2) 如何编写更好的代码
感谢您的帮助。谢谢
var csv = require('fast-csv');
var Promise = require('bluebird');
var fs = require('fs');
var request = require('request');
var path = "test.csv";
var promiseCSV = Promise.method(function(path, options) {
return new Promise(function(resolve, reject) {
var records = [];
csv
.fromPath(path, options)
.on('data', function(record) {
records.push(record);
})
.on('end', function() {
resolve(records);
console.log('done');
});
});
});
var download = function(uri, filename, callback){
request.head(uri, function(err, res, body){
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
promiseCSV(path).then(function (records) {
for(i=0;i<records.length;i++)
{
download(records[i][0],'img/'+records[i][1], function(){
});
}
});
这会将您的请求限制为一次一个。另一种选择是使用 throttled-request 来限制单位时间内的请求数。
var i = 0;
promiseCSV(path).then(function (records) {
next();
function next(){
download(records[i][0],'img/'+records[i][1], function(){
i++;
if (i < records.length) next();
});
}
});
此外,您的 records 变量超出范围,您需要将其移出才能访问它:
var records = []; // move out to global scope to access from elsewhere
var promiseCSV = Promise.method(function(path, options) {
return new Promise(function(resolve, reject) {
csv
.fromPath(path, options)
.on('data', function(record) {
records.push(record);
})
.on('end', function() {
resolve(records);
console.log('done');
});
});
});