您好我正在使用节点制作网络抓取工具,但代码始终返回'undefined',我尝试使用'async'模块,但结果是一样的。
错误在哪里?
var request = require('request');
var cheerio = require('cheerio');
//this function returns a info of a movie
var get_info = function (url){
var meta = {
title : '',
year : '',
length : '',
gen : '',
details : '',
raiting : '',
};
request.get(url, function (error, response, html){
if (!error && response.statusCode == 200){
var $ = cheerio.load(html);
meta.title = $('.movie-title h1').find('a').text();
meta.year = $('.release').text();
meta.length = $('.running_time').text().replace('minutos', '');
meta.gen = $('.btn-tags-list').find('a').first().text();
meta.details = $('.description').find('p').text();
meta.raiting = $('.movie-rating-average').find('.average').text();
};
});
return meta;
};
感谢。
答案 0 :(得分:1)
您将使用回调,因为get
是异步请求:
var get_info = function (url, callback){
var meta = {
title : '',
year : '',
length : '',
gen : '',
details : '',
raiting : '',
};
request.get(url, function (error, response, html){
if (!error && response.statusCode == 200){
var $ = cheerio.load(html);
meta.title = $('.movie-title h1').find('a').text();
meta.year = $('.release').text();
meta.length = $('.running_time').text().replace('minutos', '');
meta.gen = $('.btn-tags-list').find('a').first().text();
meta.details = $('.description').find('p').text();
meta.raiting = $('.movie-rating-average').find('.average').text();
callback(meta);
};
});
};
并使用它:
get_info(url, function(meta) {
console.log(meta);
});
答案 1 :(得分:1)
在处理异步时你不能返回一个值(你应该读一下异步的工作方式和回调函数)。
要解决这个问题,你需要为你的方法(get_info)提供一个回调参数,它基本上会扩展回调链。类似的东西:
var get_info = function(url,callback){
/* ... */
request.get(url, function(error, response, html){
if (!error && response.statusCode == 200){
// populate `meta`
callback(meta);
}
});
};
您的实施将变为:
get_info('foo', function(meta){
// you may now work with `meta`
});