予約代理店のサイトから連絡先情報 (URL と電子メール) を取得するために、cheerio.js と request.js の上に小さなスクレイパー スクリプトを作成しました。実行して必要なすべての情報を返しますが、実行中に次の警告が5回連続して表示されます。
(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)
私の本能は、別のリクエストでリクエストをネストしたという事実のために、おそらくこの警告を受けていると言っています。確かではありませんが、私が知っていることは、getArtistInfo()
関数のcheerio.js.each()
ループの1つにあるネストされたリクエストが呼び出されたときに警告が表示されるということです。(私が何を意味するかを見るために以下のコードを見てください)
私のスクレーパーのコードは次のとおりです。
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 メモリ リークの問題が発生しないようにするにはどうすればよいですか?