我正在对 nodejs 进行抓取操作,我正在使用请求连接到站点,cheerio 访问数据,mongodb 存储提取的数据。我也使用 async.js 来避免无限递归。
我遇到了内存问题,因为我的进程占用了内存并且没有释放它。我认为问题出在 mongodb 上,因为如果我不使用 mongodb,内存就会保持稳定。
这是我总结的代码:
// Use function scrape_urls to process the urls
var q = self.asyn.queue(scrape_urls, 3);
//I push a bunch of urls ...
for (var j = 0; j < self.urls_data.length; j++) {
q.push(self.urls_data[j]);
}
q.drain = function () {
console.log("END");
};
function scrape_urls(data_url, next_action) {
request({
method: 'GET',
url: data_url.url
}, function (err, response, body) {
var $ = cheerio.load(body);
data = { // ... scraped data ... };
mongo_client.connect(connection_string, function (err, db) {
if (err) { return console.dir(err); }
var collection = db.collection('foo');
collection.insert(data);
next_action();
});
});
};
正如我所说,如果我避免使用 mongodb,而只使用 request 连接到 url,内存不会无限增长,我认为连接到 mongodb 是问题所在。
有任何想法吗?