我正在尝试获取youtube视频,以获取我从officialcharts.com上抓取的数据。 我能够抓取数据并为他们获取youtube网址。但是,当我尝试推动 数据只进入数组,标题和艺术家名称被推送。变量youtubeUrl未分配值。为什么变量youtubeUrl不在范围内?
我尝试了多种方法。我尝试在搜索功能中声明youtubeUrl然后在请求之外,但我得到了同样的问题。
我也尝试在搜索功能中移动json.tracks.push但是json不在范围内,因此没有任何内容添加到轨道
我正在使用https://www.npmjs.org/package/youtube-search搜索视频。
// Scraping charts
app.get('/scrape', function(req, res){
url = 'http://www.officialcharts.com/music-charts/';
request(url, function(error, response, html){
if(!error){
var $ = cheerio.load(html);
var title, artist, youtubeUrl;
var json = {tracks:[]};
$('div .infoHolder').each(function(){
var data = $(this);
var opts = {
maxResults: 1,
startIndex: 1
};
// Scrapped title and artist name
title = data.children('h3').text();
artist = data.children('h4').text();
// Searching for youtube videos
search(title, opts, function (err, results) {
if (err) {
return console.log(err);
}
youtubeUrl = results[0].url;
})
console.log(youtubeUrl); // THIS IS RETURNED UNDEFINED
// youtubeUrl IS NOT PUSHED TO THE ARRAY
// ONLY TITLE AND ARTIST PUSHED
json.tracks.push({title:title,artist:artist,url: youtubeUrl});
})
}
res.send(json);
})
})
答案 0 :(得分:-1)
我的猜测是你在.each()之外定义了youtubeUrl变量,然后尝试从search()函数中获取它。
尝试在.each()中声明youtubeUrl变量,因为它似乎不需要长时间保存数据。这应该够了吧。
编辑: 忘记我刚写的内容,因为我完全误读了你的代码。检查您在搜索功能中获得的内容。它似乎是异步的,因此在尝试获取其值后设置youtubeUrl var。您可以尝试将数据集合移动到搜索成功后调用的外部函数。
// Scraping charts
app.get('/scrape', function(req, res){
url = 'http://www.officialcharts.com/music-charts/';
function pushInfo(res,title, artist, youtubeUrl){
res.send({title:title,artist:artist,url: youtubeUrl});
};
request(url, function(error, response, html){
if(!error){
var $ = cheerio.load(html);
var title, artist, youtubeUrl;
var json = {tracks:[]};
$('div .infoHolder').each(function(){
var data = $(this);
var opts = {
maxResults: 1,
startIndex: 1
};
// Scrapped title and artist name
title = data.children('h3').text();
artist = data.children('h4').text();
// Searching for youtube videos
search(title, opts, function (err, results) {
if (err) {
return console.log(err);
}
//youtubeUrl = results[0].url;
pushInfo(res, title, artist, results[0].url);
});
});
}
});
});
这是完全未经测试的,因为我实际上并不知道搜索功能的作用,但是一旦搜索功能使用此方法完成,至少所有信息都应该可用。