Javascript 构建一个简单的Node.js刮片函数

Javascript 构建一个简单的Node.js刮片函数,javascript,node.js,web-scraping,Javascript,Node.js,Web Scraping,我正试图为nodeJS构建一个非常简单的scraper函数——一个我可以传递URL的函数,它以var data的形式返回被刮取的数据 我是Node.js的新手,无法理解以下内容不起作用的原因: var request = require('request'); var cheerio = require('cheerio'); function scrape(url) { console.log("Scraping: " + url); request(url, functio

我正试图为nodeJS构建一个非常简单的scraper函数——一个我可以传递URL的函数,它以
var data
的形式返回被刮取的数据

我是Node.js的新手,无法理解以下内容不起作用的原因:

var request = require('request');
var cheerio = require('cheerio');

function scrape(url) {
    console.log("Scraping: " + url);
    request(url, function(err, resp, body) {

            if (err) {
                throw err;
            }
            var html = cheerio.load(body);
            return html;
        });
}


var data = scrape('http://www.stackoverflow.com');

$ = data;
var logo = $('#hlogo a').text();
console.log(logo);
上面的代码应该返回
“堆栈溢出”
,但显然不是。当我在控制台中运行此命令时,我得到一个错误:

var logo = $('#hlogo a').text();
           ^
TypeError: Property '$' of object #<Object> is not a function
var logo=$('hlogo a').text();
^
TypeError:对象#的属性“$”不是函数

你知道为什么这对我不起作用吗?

你的
数据将是未定义的,因为
scrape
函数不返回值,而且它是异步的

您需要将逻辑更改为以下内容:

function scrape(url, oncomplete) {
    console.log("Scraping: " + url);
    request(url, function(err, resp, body) {

        if (err) {
            throw err;
        }
        var html = cheerio.load(body);
        oncomplete(html);
    });
}


scrape('http://www.stackoverflow.com', function(data) { /* do work here*/ });

你能详细解释一下为什么异步在这里不好吗?我希望能够向它抛出多个URL,并一致地刮取它们(例如,在一个数组中有100个URL,并使用
for循环
对它们进行迭代,并对每个URL并行调用
scrape()
。或者我是否不支持异步性?我是否说异步性不好?因为JS是单线程异步请求是实现异步性的唯一方法“并行”刮片。但是你的代码没有考虑到它是异步的。我向你展示了逻辑应该是什么样子。啊,有道理。干杯,伙计。