使用异步函数返回的数据的正确方法(web抓取示例)



所以我有这个简单的代码来挖掘一些视频url,以便在之后对其应用另一个抓取功能。我的问题是,我似乎无法返回url填充的数组。我知道这是一个范围问题,但我对Javascript不太熟悉,我的知识让我尽可能地了解。

这是代码:

var request = require('request');
var cheerio = require('cheerio');
var startUrl = 'http://www.somewebsite.com/mostviewed';
var getVideoIds = function(url) {
    var urls = [];
    request(url, function(err, resp, body){
        if (err)
            throw err;
        $ = cheerio.load(body);

        var videoUrls = [];
        $('.videoTitle a').each(function() {
            videoUrls.push($(this).attr('href'));
        });
    });
   return urls;
}

var urlsToScrap = getVideoIds(startUrl);
console.log(urlsToScrap);

PS:当前代码返回一个空数组;

您有两个问题。一种是,您将返回urls,但它从未设置为任何值。您将值推送到videoUrls上,但返回的是空的urls数组。另一个是request是一个异步函数。您将需要设置一个回调来设置视频URL,一旦它将刮回的数据。

因此:

var urls = [];
request(url, function(err, resp, body){
    if (err)
        throw err;
    $ = cheerio.load(body);
    $('.videoTitle a').each(function() {
        urls.push($(this).attr('href'));
    });
    onVideosScraped();
});
function onVideosScraped() {
    console.log(urls);  
}

这应该有效,而且是一种基本的方法。当然,你可以将任何你想要的东西包装在函数中,使其更可重用,但我希望这能回答你的问题。

最新更新