【问题标题】:Building a simple Node.js scraper function构建一个简单的 Node.js 爬虫函数
【发布时间】:2013-06-04 08:24:52
【问题描述】:

我正在尝试为 nodeJS 构建一个非常简单的爬虫函数 - 只是一个我可以传递 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);

上面的代码应该返回"Stack Overflow",但显然没有。当我在控制台中运行它时,我得到一个错误:

var logo = $('#hlogo a').text();
           ^
TypeError: Property '$' of object #<Object> is not a function

任何想法为什么这对我不起作用?

【问题讨论】:

    标签: javascript node.js web-scraping


    【解决方案1】:

    您的data 将未定义,因为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 loop 遍历它们并在每个上并行调用 scrape()。或者我​​是不了解异步性?
    • 我说异步不好?由于 JS 是单线程异步请求是实现“并行”抓取的唯一方法。但是您的代码没有考虑到它是异步的。我向你展示了逻辑的外观。
    • 啊,有道理。干杯伙伴。
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 2023-03-13
    • 2017-01-26
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多