通过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");
希望对您有所帮助。
我编写了从一些网页中解析大量单词 (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");
希望对您有所帮助。