我正在尝试使用crawlera构建网络抓取工具。我对此有点新,所以我尝试创建一个包装函数:
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
然后我在主应用程序中调用。
crawlera.get('http://someurl').then(res => console.log('do something with the result.')
上述操作有时会导致代理错误超时。所以,当发生这种情况时,我想再次重试请求,直到成功发生,然后继续.then链接,但第19行没有达到此目的。
答案 0 :(得分:0)
我认为你应该改变第19行
crawlera.get(url);
至
crawlera.get.call(crawlera, url);
当在链中调用函数时,上下文已更改,您应该将其绑定到origin crawlera对象。
我不知道你为什么要在第16行crawlera.count -= 1
中添加它。
删除它并更改第19行后,效果很好。