通过casperjs爬取后如何在json中插入数据?

How to insert data in json after crawling through casperjs?

我编写了从一些网页中解析大量单词 (innerHTML) 的代码。

我想直接将数据插入 json 文件..

这是我的js代码...

var words = [];
var casper = require('casper').create();

    function getWords() {
        var words = document.querySelectorAll('td.subject a');
        return Array.prototype.map.call(words, function(e) {
            return e.innerHTML;
        });
    }


        casper.start('http://www.todayhumor.co.kr/board/list.php?table=bestofbest', function() {                
            words = this.evaluate(getWords);
        });

        for (var i=2; i <=5; i++) {
        casper.thenOpen('http://www.todayhumor.co.kr/board/list.php?table=bestofbest&page='+i, function() {              

            words = words.concat(this.evaluate(getWords));
        });
        }

    casper.run(function() {
        // echo results in some pretty fashion
        this.echo(words.length + ' links found:').exit();
        this.echo(words.join('\n')).exit();
});

我运行这个代码通过终端是这样的!

username@wow:~/workspace/app/assets/javascripts $ casperjs application.js

结果为(例)

150 words found:
apple
banana
melon
kiwi
citrus
watermelon
passionfruit
mango
orange
...

所以我想将此数据插入到我的 json 文件的 "word" 部分 (下面 json 的示例代码)

并自动添加其他列("type":"fruit" 和 "spell":)

{ "my_initial_words": [
    {
    "type": "fruit",
    "word": "apple",
    "spell": "ap"
    },
    {
    "type": "fruit",
    "word": "banana",
    "spell": "ba"
    },
    {
    "type": "fruit",
    "word": "melon",
    "spell": "me"
    }   

]
}
----------------------------------------------------------------------------

感谢您添加更多答案!.. 但我不知道我应该把这些代码放在哪里

你能再告诉我一次吗...你给我的代码执行了 "Saving the results to JSON file?" 因为我必须读取 json file(makeyourap.json) in我的 seeds.rb 文件是这样的

require 'json'
file = File.open(Rails.root.join('db','makeyourap.json'))
contents = file.read
json = ActiveSupport::JSON.decode(contents)["my_initial_words"]

通过casper写入文件

如果你想拥有一个文件,你可以从中读取和写入附加内容,你可以这样做:

var fs = require('fs');
var FILENAME = 'makeyourap.json';
function add_new_fruits(fruits) {
    var data;
    if ( fs.isFile(FILENAME) ) {
        data = fs.read(FILENAME);
    } else {
        data = JSON.stringify({'my_initial_words' : [] });
    }
    var json = JSON.parse(data);
    fruits.forEach(function(word) {
        json.my_initial_words.push({"type": "fruit",
                                    "name": word,
                                    "spell": word.slice(0,2)});
    });
    data = JSON.stringify(json, null, '\t');
    fs.write(FILENAME, data, "w");
}

用这个代替旧的 this.echo。就叫它

casperjs application.js

这要么从文件中读取对象,要么在对象不存在时创建它。然后,它附加新水果中的每个新对象(包括重复项),并将其写回 FILENAME.

以前的方法:如何自己滚动

创建对象

因此,首先,您要创建一个只有参数 my_initial_words 的对象,其值如上。

您可以通过

创建函数
function createFinal(wordArray) {
    var out = [];
    wordArray.forEach(function(word) {
        out.push({"type": "fruit", "name": word, "spell": word.slice(0,2)});
    });
    return out;
}

创建阵列。然后,通过

创建对象
var my_object = { "my_initial_words": createFinal(words) };

到JSON

Javascript 有一个 built-in JSON-object。使用 javascript-对象,如

var my_object = { "my_initial_words": ...

同上,使用

JSON.stringify(my_object) 

获取要写入的 JSON 表示。

旧:通过重定向写入文件

之前,您有

this.echo(words.join('\n')).exit();

它为您提供了基本列表。使用 this.echo,尝试将其替换为

var my_object = { "my_initial_words": createFinal(words) };
this.echo(JSON.stringify(my_object)).exit();

这将打印到标准输出。只需删除其他 this.echo 行(找到 150 个单词)并通过

重定向输出
casperjs application.js > makeyourap.json

如果你想在 casperjs 中写入文件,请查看 write-results-into-a-file-using-casperjs

所以,是这样的吗?

function makeTypeObject(name, type) {
  return {
    name: name,
    type: type,
    spell: name.substr(0,2)
  };
}

var wordDesc = words.map(function (word) { 
   return makeTypeObject(word, "fruit"); 
});

var finalObject = {
  my_initial_words: wordDesc
};

var jsonString = JSON.stringify(finalObject);
// if you want prettyprint, try JSON.stringify(finalObject, null, "\t");

希望对您有所帮助。