我正在尝试从YouTube上获取我从Officialcharts.com抓取的数据的视频。
我可以抓取数据并获取它们的youtube网址。但是当我尝试 push
数据仅将标题和艺术家姓名推送到数组中。变量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);
})
})
最佳答案
我的猜测是,您是在.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);
});
});
}
});
});
这是完全未经测试的,因为我实际上并不知道搜索功能的作用,但是一旦使用此方法完成搜索功能,至少应该可以使用所有信息。