如何调用 REC Registery API 并将返回的 JSON 存储到某种数据库中
How to call REC Registery API and store returned JSONs into some kind of database
我想将其分解为更小、更严密的问题,但我不知道我还不够了解什么来做到这一点。所以希望能得到具体的答案来帮助做到这一点。
解决方案的范围需要接收和解析大量记录,2013 年有约 1700 万个证书交易,而我只对非常小的部分感兴趣订单 40,000 条记录。
在伪代码中:
- 迭代日期(thisDate)
- 在这个日期
向API发送消息
- 收到 JSONS 作为今天的记录
- 检查 todaysRecords 以查找结构中匹配的任何条件
- 将 todaysRecords 的子集附加到 recordsOut
- 将 recordsOut 保存到 SQL/CSV 文件。
Australian Government RET Scheme called the REC Registery and as well as the web interface linked to here下有一个大型的可再生能源证书数据库可供使用,API 提供了一个简单的调用逻辑如下
http://rec-registry.gov.au/rec-registry/app/api/public-register/certificate-actions?date=<user provided date>
其中:
- URL 的日期部分应由用户提供
- 日期格式应为 YYYY-MM-DD(无尖括号和 1 个日期限制)
返回 JSON(每天可能有 100,000 条记录)。
API 文档 (13pp PDF) 是 here,但它主要解释与我的问题不太相关的返回结构的元素。包括两个示例 JSON 响应。
虽然我知道一些 Javascript(主要不是在网络上下文中),但我不确定如何在脚本中发送此消息,并且我认为我需要在服务器端执行此操作才能处理(过滤)返回的信息,然后保存我感兴趣的记录。我可以毫无问题地解析 JSON(如果我可以使用 JS)并复制我希望保存的对象 我不确定从哪里开始这样做。我是否需要 LAMP 设置来执行此操作(或 MAMP,因为我在 OS X 上)或者是否有更轻量级的 JS 方式我可以执行此操作。我从来不知道如何从网络浏览器 JS 中保存文件,我认为它出于安全原因被禁止,但我想有办法。
如果我可以重写这个问题,使其更清楚、更有效地征求答案,我也很乐意编辑问题。
我想我可能正在寻找一些样板代码来调用像这样的简单 API 以及我需要在其中执行此操作的堆栈或应用程序上下文。我意识到有几种潜在的方法可以执行此操作,但寻找具有 JS 知识且 PHP/Python 经验不多(但愿意学习它需要什么)的人最直接。
简单吧?
好的,为您指明正确的方向。
要求
如果选择的语言是 Javascript,您将需要安装 Node.js。不需要任何服务器。
同样适用于 PHP 或 Python 或其他。不需要 apache,只需要 lang int。
运行 带有节点的脚本
在某处创建一个file.js
。要 运行 它,您只需(在控制台中)键入 node file.js
(在文件所在的目录中。
从 REC Web 服务获取信息
这是一个 GET 请求的例子:
var https = require('https');
var fs = require('fs');
var options = {
host: 'rec-registry.gov.au',
port: 443,
path: '/rec-registry/app/api/public-register/certificate-actions?date=2015-06-03'
};
var jsonstr = '';
var request = https.get(options, function(response) {
process.stdout.write("downloading data...");
response.on('data', function (chunk) {
process.stdout.write(".");
jsonstr += chunk;
});
response.on('end', function () {
process.stdout.write("DONE!");
console.log(' ');
console.log('Writing to file...');
fs.writeFile("data.json", jsonstr, function(err) {
if(err) {
return console.error('Error saving file');
}
console.log('The file was saved!');
});
});
})
request.on('error', function(e) {
console.log('Error downloading file: ' + e.message);
});
将 json 字符串转换为 object/array
使用JSON.parse
正在解析数据
examine todaysRecords to look for whatever criteria match inside the structure
无法在这方面帮助您,但查找正确的对象属性应该相对简单。
注意:基本上,您从请求中得到的是一个字符串。然后,您使用
解析该字符串
var foo = JSON.parse(jsonstr)
在这种情况下 foo
是一个对象。结果"certificates"其实是在属性里面result
,这是一个数组
var results = foo.result;
在此示例中,数组包含大约 1700 条记录,证书的结构如下所示:
"actionType": "STC created",
"completedTime": "2015-06-02T21:51:26.955Z",
"certificateRanges": [{
"certificateType": "STC",
"registeredPersonNumber": 10894,
"accreditationCode": "PVD2259359",
"generationYear": 2015,
"generationState": "QLD",
"startSerialNumber": 1,
"endSerialNumber": 72,
"fuelSource": "S.G.U. - solar (deemed)",
"ownerAccount": "Solargain PV Pty Ltd",
"ownerAccountId": 25782,
"status": "Pending audit"
}]
因此,例如,要访问第一个 "certificate" 的第一个 "certificateRanges" 的 "ownerAccount",您可以这样做:
var results = JSON.parse(jsonstr).result;
var ownerAccount = results[0].certificateRanges[0].ownerAccount;
正在创建一个 csv
最好的方法是创建一个抽象结构(满足您的需要)并将其转换为 csv。
有一个很好的 npm 库 json2csv 可以帮助你
示例:
var fs = require('fs');
var json2csv = require('json2csv');
var fields = ['car', 'price', 'color']; // csv titles
var myCars = [
{
"car": "Audi",
"price": 40000,
"color": "blue"
}, {
"car": "BMW",
"price": 35000,
"color": "black"
}, {
"car": "Porsche",
"price": 60000,
"color": "green"
}
];
json2csv({ data: myCars, fields: fields }, function(err, csv) {
if (err) console.log(err);
fs.writeFile('file.csv', csv, function(err) {
if (err) throw err;
console.log('file saved');
});
});
如果您希望追加而不是写入新文件,您可以使用
fs.appendFile('file.csv', csv, function (err) { });
我想将其分解为更小、更严密的问题,但我不知道我还不够了解什么来做到这一点。所以希望能得到具体的答案来帮助做到这一点。
解决方案的范围需要接收和解析大量记录,2013 年有约 1700 万个证书交易,而我只对非常小的部分感兴趣订单 40,000 条记录。
在伪代码中:
- 迭代日期(thisDate)
- 在这个日期 向API发送消息
- 收到 JSONS 作为今天的记录
- 检查 todaysRecords 以查找结构中匹配的任何条件
- 将 todaysRecords 的子集附加到 recordsOut
- 将 recordsOut 保存到 SQL/CSV 文件。
Australian Government RET Scheme called the REC Registery and as well as the web interface linked to here下有一个大型的可再生能源证书数据库可供使用,API 提供了一个简单的调用逻辑如下
http://rec-registry.gov.au/rec-registry/app/api/public-register/certificate-actions?date=<user provided date>
其中:
- URL 的日期部分应由用户提供
- 日期格式应为 YYYY-MM-DD(无尖括号和 1 个日期限制)
返回 JSON(每天可能有 100,000 条记录)。
API 文档 (13pp PDF) 是 here,但它主要解释与我的问题不太相关的返回结构的元素。包括两个示例 JSON 响应。
虽然我知道一些 Javascript(主要不是在网络上下文中),但我不确定如何在脚本中发送此消息,并且我认为我需要在服务器端执行此操作才能处理(过滤)返回的信息,然后保存我感兴趣的记录。我可以毫无问题地解析 JSON(如果我可以使用 JS)并复制我希望保存的对象 我不确定从哪里开始这样做。我是否需要 LAMP 设置来执行此操作(或 MAMP,因为我在 OS X 上)或者是否有更轻量级的 JS 方式我可以执行此操作。我从来不知道如何从网络浏览器 JS 中保存文件,我认为它出于安全原因被禁止,但我想有办法。
如果我可以重写这个问题,使其更清楚、更有效地征求答案,我也很乐意编辑问题。
我想我可能正在寻找一些样板代码来调用像这样的简单 API 以及我需要在其中执行此操作的堆栈或应用程序上下文。我意识到有几种潜在的方法可以执行此操作,但寻找具有 JS 知识且 PHP/Python 经验不多(但愿意学习它需要什么)的人最直接。
简单吧?
好的,为您指明正确的方向。
要求
如果选择的语言是 Javascript,您将需要安装 Node.js。不需要任何服务器。
同样适用于 PHP 或 Python 或其他。不需要 apache,只需要 lang int。
运行 带有节点的脚本
在某处创建一个file.js
。要 运行 它,您只需(在控制台中)键入 node file.js
(在文件所在的目录中。
从 REC Web 服务获取信息
这是一个 GET 请求的例子:
var https = require('https');
var fs = require('fs');
var options = {
host: 'rec-registry.gov.au',
port: 443,
path: '/rec-registry/app/api/public-register/certificate-actions?date=2015-06-03'
};
var jsonstr = '';
var request = https.get(options, function(response) {
process.stdout.write("downloading data...");
response.on('data', function (chunk) {
process.stdout.write(".");
jsonstr += chunk;
});
response.on('end', function () {
process.stdout.write("DONE!");
console.log(' ');
console.log('Writing to file...');
fs.writeFile("data.json", jsonstr, function(err) {
if(err) {
return console.error('Error saving file');
}
console.log('The file was saved!');
});
});
})
request.on('error', function(e) {
console.log('Error downloading file: ' + e.message);
});
将 json 字符串转换为 object/array
使用JSON.parse
正在解析数据
examine todaysRecords to look for whatever criteria match inside the structure
无法在这方面帮助您,但查找正确的对象属性应该相对简单。
注意:基本上,您从请求中得到的是一个字符串。然后,您使用
解析该字符串var foo = JSON.parse(jsonstr)
在这种情况下 foo
是一个对象。结果"certificates"其实是在属性里面result
,这是一个数组
var results = foo.result;
在此示例中,数组包含大约 1700 条记录,证书的结构如下所示:
"actionType": "STC created",
"completedTime": "2015-06-02T21:51:26.955Z",
"certificateRanges": [{
"certificateType": "STC",
"registeredPersonNumber": 10894,
"accreditationCode": "PVD2259359",
"generationYear": 2015,
"generationState": "QLD",
"startSerialNumber": 1,
"endSerialNumber": 72,
"fuelSource": "S.G.U. - solar (deemed)",
"ownerAccount": "Solargain PV Pty Ltd",
"ownerAccountId": 25782,
"status": "Pending audit"
}]
因此,例如,要访问第一个 "certificate" 的第一个 "certificateRanges" 的 "ownerAccount",您可以这样做:
var results = JSON.parse(jsonstr).result;
var ownerAccount = results[0].certificateRanges[0].ownerAccount;
正在创建一个 csv
最好的方法是创建一个抽象结构(满足您的需要)并将其转换为 csv。
有一个很好的 npm 库 json2csv 可以帮助你
示例:
var fs = require('fs');
var json2csv = require('json2csv');
var fields = ['car', 'price', 'color']; // csv titles
var myCars = [
{
"car": "Audi",
"price": 40000,
"color": "blue"
}, {
"car": "BMW",
"price": 35000,
"color": "black"
}, {
"car": "Porsche",
"price": 60000,
"color": "green"
}
];
json2csv({ data: myCars, fields: fields }, function(err, csv) {
if (err) console.log(err);
fs.writeFile('file.csv', csv, function(err) {
if (err) throw err;
console.log('file saved');
});
});
如果您希望追加而不是写入新文件,您可以使用
fs.appendFile('file.csv', csv, function (err) { });