1

我正在尝试获取从 officialcharts.com 抓取的数据的 youtube 视频。我能够抓取数据并为他们获取 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);

    })
})
4

1 回答 1

-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);
            });
        });
    }
    });
});

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

于 2014-09-16T07:38:19.277 回答