2

我正在尝试通过spookyjs从站点抓取数据并存储在mongoDB中。我能够从网站获取数据。但无法将 spookyjs 环境中的抓取数据保存到 mongoDB。为了保存抓取的数据,我将数据库模型实例传递给spookyjs 。我参考了下面的链接。

https://github.com/SpookyJS/SpookyJS/wiki/Introduction

下面是我在 prod_link_info 变量中提取数据并将其值传递给 mongoDB 的代码

   var product_model = require('./product').product_model;

     //get results
       spooky.then([{product_model:product_model},function(){
                this.waitForSelector('li[id^="product_"]', function() {
                   //  Get info on all elements matching this CSS selector
                    var prod_link_info = this.evaluate(function() {
                        var nodes = document.querySelectorAll('li[id^="product_"]');

                        return [].map.call(nodes, function(node) { // Alternatively: return Array.prototype.map.call(...
                            return node.querySelector('a').getAttribute('href')+"\n";
                        });
                    });

            //insert values in mongodb
            for (var i = 0; i < prod_link_info.length; i++) {
                product_model.create(
                    {
                        prod_link_info:prod_link_info[i],
                    }, function(err, product){
                        if(err) console.log(err);
                        else console.log(product);
                    });
            } });
    }]);

以下是上述代码中使用的数据库模式和模型的代码。

var mongoose=require('mongoose');
var Schema = mongoose.Schema;
// create a schema
var productSchema = new Schema({
    prod_link_info: String,

});

var product_model= mongoose.model('product_model', productSchema);

module.exports = {
    product_model: product_model
}

但是当我运行上面的代码时,它给了我以下错误ReferenceError: Can't find variable: product_model

我想将从 spookyjs 提取的数据存储到 mongoDB。请建议我在哪里做错了。

4

1 回答 1

0

当您将变量的哈希传递给 spooky 时,它会使用转换为字符串JSON.stringify,然后在 casper 环境中使用转换回对象JSON.parse(请参阅文档);所以不可能将猫鼬模型传递给 casper 环境(而且没有实际原因)。

为了解决这个问题,你应该从 Spooky (casper) 环境中传递数据。据我所知,唯一的方法是获取emit数据,然后使用spooky.on. 您的示例应如下所示:

var product_model = require('./product').product_model;

//get results
spooky.then([{},function(){
        this.waitForSelector('li[id^="product_"]', function() {
           //  Get info on all elements matching this CSS selector
            var prod_link_info = this.evaluate(function() {
                var nodes = document.querySelectorAll('li[id^="product_"]');

                return [].map.call(nodes, function(node) { // Alternatively: return Array.prototype.map.call(...
                    return node.querySelector('a').getAttribute('href')+"\n";
                });
            });

            this.emit('data.ready', prod_link_info);
        });
}]);

spooky.on('data.ready', function (prod_link_info) {
    //insert values in mongodb
    for (var i = 0; i < prod_link_info.length; i++) {
        product_model.create(
            {
                prod_link_info:prod_link_info[i],
            }, function(err, product){
                if(err) console.log(err);
                else console.log(product);
            });
    } 
});
于 2015-09-08T15:09:01.837 回答