使用异步抓取存档时的 ECONNRESET
ECONNRESET when using async to scrape archive
我目前正在尝试为我正在处理的 TensorFlow 实现获取一些文章数据。我试图反对的第一个来源是 Buzzfeed。我正在使用 node.js async.js 库来抓取页面,但我有一段时间总是在大约 200 篇左右的文章后从他们的服务器收到 ECONNRESET 错误。
现在当我 运行 这个时,它似乎确实很快发出请求,但这就是我决定使用 async.eachSeries 的原因,因为它适用延迟。我会继续关注这个问题,但如果有人发现我做错了什么或者可能有更好的方法来实现这一点,我很想听听您的意见。谢谢!
const scraper = testHelperGetScraper();
// scrape links to each news in buzz archive page
const archiveUrl = 'http://www.buzzfeed.com/archive';
let fileNum = -1;
scraper.scrapeArchiveDates(archiveUrl, function(err, dates){
async.eachSeries(dates.yearUrl, function(url, cb){
async.waterfall([
function(callback){
scraper.scrapeArchive(url, callback);
},
function(urlArr, callback){
for (var i in urlArr.url){
if (typeof (urlArr.url[i]) === 'string'){
scraper.scrapeArticle(urlArr.url[i], callback);
}
}
} ,function(res, callback){
cb();
callback(null, res);
}
],
function(err, buzzresult) {
if (err){
_logger.error('Error while inserting test data', err);
}
buzzresult.uniqueId = UniqueHelper.getUIntId({
text: buzzresult.title
, options: {
ignoreCase: true
, strip: ['urls', 'hashtags', 'users', 'quotes', 'punct']
}
});
let fileFullPath = _rootFolderWhereYouWantToSave
+ 'rawdata_' + buzzresult.uniqueId + '.txt';
//_logger.debug('fileFullPath', fileFullPath);
let finalDataWritten = buzzresult.title + os.EOL + buzzresult.body + os.EOL;
writeArticleFile(fileFullPath, finalDataWritten);
//console.log('Finsihed calling WriteArticleFile: ', finalDataWritten);
_counter += 1;
console.log('NumArticlesWritten: ', _counter);
});
}, function (error) {
if (error) {
throw error;
}
console.log('Finished!');
});
});
我稍微简化了你的代码。
您可以使用命名函数来创建更具可读性的代码。
const scraper = testHelperGetScraper();
const archiveUrl = 'http://www.buzzfeed.com/archive';
let fileNum = -1;
scraper.scrapeArchiveDates(archiveUrl, function(err, dates){
async.eachSeries(dates, parseDate, (err) => (err) ? throw err : console.log('Finished!'););
});
function parseDate(date, callback) {
scraper.scrapeArchive(date.yearUrl, function(err, urls) {
if (err)
return callback(err);
urls = urls.filter((url) => typeof(url) === 'string'));
async.each(urls, scraper.scrapeArticle, function(err, buzzresult) {
if (err) {
_logger.error('Error while inserting test data', err);
return callback(err);
}
... // process result
})
});
}
我目前正在尝试为我正在处理的 TensorFlow 实现获取一些文章数据。我试图反对的第一个来源是 Buzzfeed。我正在使用 node.js async.js 库来抓取页面,但我有一段时间总是在大约 200 篇左右的文章后从他们的服务器收到 ECONNRESET 错误。
现在当我 运行 这个时,它似乎确实很快发出请求,但这就是我决定使用 async.eachSeries 的原因,因为它适用延迟。我会继续关注这个问题,但如果有人发现我做错了什么或者可能有更好的方法来实现这一点,我很想听听您的意见。谢谢!
const scraper = testHelperGetScraper();
// scrape links to each news in buzz archive page
const archiveUrl = 'http://www.buzzfeed.com/archive';
let fileNum = -1;
scraper.scrapeArchiveDates(archiveUrl, function(err, dates){
async.eachSeries(dates.yearUrl, function(url, cb){
async.waterfall([
function(callback){
scraper.scrapeArchive(url, callback);
},
function(urlArr, callback){
for (var i in urlArr.url){
if (typeof (urlArr.url[i]) === 'string'){
scraper.scrapeArticle(urlArr.url[i], callback);
}
}
} ,function(res, callback){
cb();
callback(null, res);
}
],
function(err, buzzresult) {
if (err){
_logger.error('Error while inserting test data', err);
}
buzzresult.uniqueId = UniqueHelper.getUIntId({
text: buzzresult.title
, options: {
ignoreCase: true
, strip: ['urls', 'hashtags', 'users', 'quotes', 'punct']
}
});
let fileFullPath = _rootFolderWhereYouWantToSave
+ 'rawdata_' + buzzresult.uniqueId + '.txt';
//_logger.debug('fileFullPath', fileFullPath);
let finalDataWritten = buzzresult.title + os.EOL + buzzresult.body + os.EOL;
writeArticleFile(fileFullPath, finalDataWritten);
//console.log('Finsihed calling WriteArticleFile: ', finalDataWritten);
_counter += 1;
console.log('NumArticlesWritten: ', _counter);
});
}, function (error) {
if (error) {
throw error;
}
console.log('Finished!');
});
});
我稍微简化了你的代码。
您可以使用命名函数来创建更具可读性的代码。
const scraper = testHelperGetScraper();
const archiveUrl = 'http://www.buzzfeed.com/archive';
let fileNum = -1;
scraper.scrapeArchiveDates(archiveUrl, function(err, dates){
async.eachSeries(dates, parseDate, (err) => (err) ? throw err : console.log('Finished!'););
});
function parseDate(date, callback) {
scraper.scrapeArchive(date.yearUrl, function(err, urls) {
if (err)
return callback(err);
urls = urls.filter((url) => typeof(url) === 'string'));
async.each(urls, scraper.scrapeArticle, function(err, buzzresult) {
if (err) {
_logger.error('Error while inserting test data', err);
return callback(err);
}
... // process result
})
});
}