我正在尝试从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);
            });
        });
    }
    });
});

这是完全未经测试的,因为我实际上并不知道搜索功能的作用,但是一旦使用此方法完成搜索功能,至少应该可以使用所有信息。

07-25 21:47