2013-09-16 7 views
2

Я написал небольшой скрипт скрепера, построенный поверх cheerio.js и request.js, чтобы получить контактную информацию (URL-адреса и электронные письма) с сайта агентства бронирования. Хотя это запустить и возвращает всю информацию, мне нужно, я получаю следующее предупреждение 5 раз подряд во время работы его:(узел) предупреждение: возможно обнаружение утечки памяти EventEmitter

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. 
Trace 
    at Socket.EventEmitter.addListener (events.js:160:15) 
    at Socket.Readable.on (_stream_readable.js:689:33) 
    at Socket.EventEmitter.once (events.js:179:8) 
    at Request.onResponse (/home/max/Desktop/scraping/node_modules/request/request.js:625:25) 
    at ClientRequest.g (events.js:175:14) 
    at ClientRequest.EventEmitter.emit (events.js:95:17) 
    at HTTPParser.parserOnIncomingClient [as onIncoming] (http.js:1689:21) 
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:120:23) 
    at Socket.socketOnData [as ondata] (http.js:1584:20) 
    at TCP.onread (net.js:525:27) 

Мой инстинкт говорит мне, что я, вероятно, получить это предупреждение из-за того что я вложил запрос в другой запрос. Я не уверен, но, но я знаю, что предупреждение появляется сразу, когда вызывается вложенный запрос, расположенный в одном из целых чисел cherio.js функции .each(). (Посмотреть на код ниже, чтобы увидеть, что я имею в виду)

Вот код для моего скребком:

var request = require('request'); 
var cheerio = require('cheerio'); 

var url = 'http://www.primarytalent.com/'; 

var getManyArtistsInfo = function(url){ 
    request(url, (function(){ 
    return function(err, resp, body) { 
     if(err) 
     throw err; 
     $ = cheerio.load(body); 

     // TODO: scraping goes here 
     $('#rosterlists div li a').each(function(){ 
      var urlCap = this[0]['attribs']['href'].slice(1); 
      var artistURL = url.concat(urlCap); 
      console.log(artistURL); 

      getArtistInfo(artistURL); 
     }); 
    } 
    })()); 
} 

var getArtistInfo = function(artistURL){ 
    request(artistURL, (function(){ 
    return function(err, resp, body) { 
     if(err) 
     throw err; 
     $ = cheerio.load(body); 

     console.log("NOW SCRAPING artist's PAGE") 

     var artistName = ""; 
     $('#content #col3-1 h1').each(function(){ 
     artistName = this.text(); 
     console.log(artistName); 
     }); 
     $('#content #col3-1 #links li a').each(function(){ 
     var socialURL = this.attr('href'); 
     var siteURL = ""; 
     var facebookURL = ""; 
     var twitterURL = ""; 
     var soundcloudURL = ""; 
     var bandcampURL = ""; 
     var myspaceURL = ""; 

     switch(socialURL) { 
      case socialURL.indexOf("facebook"): 
      facebookURL = socialURL; 
      console.log(facebookURL); 
      break; 
      case socialURL.indexOf("twitter"): 
      twitterURL = socialURL; 
      console.log(twitterURL); 
      break; 
      case socialURL.indexOf("soundcloud"): 
      soundcloudURL = socialURL; 
      console.log(soundcloudURL); 
      break; 
      case socialURL.indexOf("bandcamp"): 
      bandcampURL = socialURL; 
      console.log(bandcampURL); 
      break; 
      case socialURL.indexOf("myspace"): 
      myspaceURL = socialURL; 
      console.log(myspaceURL); 
      break; 
      default: 
      siteURL = socialURL; 
      console.log(siteURL) 
     } 
     }); 

     // get agentURL 
     $('#content #col3-1 .contacts li a').each(function(){ 
     var agentURL = url + this.attr('href').slice(1); 
     console.log("Agent url is : " + agentURL); 

     request(agentURL, artistName, (function(){ 
      return function(err, resp, body) { 
      if(err) 
       throw err; 
      $ = cheerio.load(body); 

      console.log("NOW SCRAPING AGENT'S PAGE") 

      var agentName = $('#content #col3-1 #details li h1').text(); 
      console.log(agentName + ' reps ' + artistName); 

      var agentEmail = $('#content #col3-1 #details li a').attr("href").slice(7); 
      console.log(agentEmail); 

      var agentPhone = $('#content #col3-1 #details li').last().text(); 
      console.log(agentPhone); 

      var agentArtistList = []; 
      $('#content #col3-1 #artists li a').each(function(){ 
       agentArtistList.push(this.text()); 
      }); 
      console.log(agentName + ' represents ' + agentArtistList.length + ' artists!'); 

      } 
     })(agentURL, artistName)); 
     }); 
    } 
    })(artistURL)); 
} 

getManyArtistsInfo(url); 

ли я сделать спагетти беспорядок здесь?

Как я могу остановить эту проблему утечки памяти EventEmitter?

+0

Какая версия узла вы используете? – hexacyanide

+0

'node -v' дает мне' v0.10.18' –

ответ

0

Нет необходимости использовать IIFE с запросом. Интересно, может ли это вызвать эту ошибку:

request(artistURL, function(err, resp, body) { 
     if(err) 
     throw err; 
     $ = cheerio.load(body); 
Смежные вопросы

 Смежные вопросы