Ich versuche, einen Web-Scraper mithilfe von crawlera zu erstellen. Ich bin ein bisschen neu in diesem und so habe ich versucht, eine Wrapper-Funktion zu erstellen:Rekursive NodeJS-HTTP-Anforderung bei fehlgeschlagenem Erfolg
const request = require('request')
var crawlera = {
apikey: 'asdfasdfasdfasdf',
limit : 10,
count : 0
}
crawlera.get = (url) => {
console.log('count: ' + crawlera.count + ' limit: ' + crawlera.limit)
var promise
if(crawlera.count < crawlera.limit){
promise = new Promise((resolve, reject) =>{
let options = {url: url, proxy: 'http://'+crawlera.apikey+':@proxy.crawlera.com:8010', "rejectUnauthorized": false}
request(options, (err, res, html) => {
crawlera.count -= 1
if (err) {
console.log('Proxy Error. Retrying..')
crawlera.get(url)
} else{
console.log('Crawlera: ' + url)
results = {}
results.html = html
results.url = options.url
resolve(results);
}
})
crawlera.count+=1
})
return promise
} else{
return Promise.resolve('concurrency count maxed')
}
}
module.exports = crawlera
Was ich dann mit meiner Haupt-App aufrufen.
crawlera.get('http://someurl').then(res => console.log('do something with the result.')
Die obige Operation ruft manchmal ein Proxyfehler-Timeout ab. Wenn das passiert, möchte ich die Anfrage so oft wiederholen, bis ein Erfolg eintritt, und dann die Abwärtskette fortsetzen, aber Zeile 19 erreicht dies nicht.
Ähnliche Antworten: [Promise Retry Design Patterns] (http://stackoverflow.com/questions/38213668/promise-retry-design-patterns/38214203#38214203) und [Promise Retry Step] (http: // stackoverflow. com/fragen/37993365/retry-a-Versprechen-Schritt/37995874 # 37995874). – jfriend00