반응형
🚀
이번 포스팅은 공공데이터 포털에서 제공하는 API문서를 Request 요청을 통해 크롤링하여 저장하는 방법에 대한 포스팅입니다. 'node-schedule' 모듈을 사용해 매 3초마다 API문서에 Request 하여 정보를 크롤링하여 DynamoDB에 저장할 수 있도록 하였습니다. 가져오는 공공데이터는 "국회의원 현황 조회" 이며 각 국회의원의 이름, 영문 이름, 한자 이름, id, 부서 코드, 사진 링크, 지역구, 당선 횟수 등등의 항목을 DB에 저장하였습니다.
물론 우리나라 국회의원이 현재 296명이고 api문서도 잘 바뀌지 않기 때문에 크롤링 시간 간격을 24시간 이상으로 잡아도 문제없지만 빠른 테스트를 위해 3초로 해놨습니다.
📁 폴더 구조
config.js는 AWS 인증키, 시크릿키에 대한 내용들이 있으며 실제 AWS 인증키, 공공 데이터 서비스 키 등등의 문자열은. env에 안전하게 보관하였습니다.
📃 공공데이터 국회의원 정보 제공 목록
📋 server.js 코드
var express = require("express");
var app = express();
var AWS = require("aws-sdk");
const scheduler = require("node-schedule");
var request = require("request");
var convert = require("xml-js");
const config = require("./config/config.js");
require("dotenv").config(); // .env 파일에서 환경변수 불러오기
const { serviceKey } = process.env;
var url =
"http://apis.data.go.kr/9710000/NationalAssemblyInfoService/getMemberCurrStateList";
var queryParams =
"?" + encodeURIComponent("serviceKey") + "=" + serviceKey; /* Service Key*/
queryParams +=
"&" + encodeURIComponent("numOfRows") + "=" + encodeURIComponent("300"); /* */
queryParams +=
"&" + encodeURIComponent("pageNo") + "=" + encodeURIComponent("1"); /* */
// app.get("/", function (req, res) {
// res.send("Hello world");
// });
// AWS 연결을 위한 세팅
AWS.config.update(config.aws_remote_config);
const docClient = new AWS.DynamoDB.DocumentClient();
// 3초마다 실행 (하루마다 실행은 => "* * * */1 * *")
const schedule = scheduler.scheduleJob("*/3 * * * * *", function () {
request(
{
url: url + queryParams,
method: "GET",
},
async function (error, response, body) {
//console.log('Status', response.statusCode);
//console.log('Headers', JSON.stringify(response.headers));
var result = convert.xml2json(body, { compact: true, spaces: 4 });
var data = JSON.parse(result).response.body.items.item;
for (var i = 0; i < data.length; i++) {
if (typeof data[i] === undefined) continue;
console.log(data[i]);
const params = {
TableName: config.aws_table_name,
Item: {
congressman_id: parseInt(data[i].num._text), // id
name: data[i].empNm._text, // 이름
engNm:
data[i].engNm === undefined ? undefined : data[i].engNm._text, // 영문 이름 ( 예외케이스: 박범계-engNm 항목 누락)
hjNm: data[i].hjNm._text, // 한자 이름
deptCd: parseInt(data[i].deptCd._text), // 부서 코드
jpgLink: data[i].jpgLink._text, // 사진 링크
origNm: data[i].origNm._text, // 지역구
reeleGbnNm: data[i].reeleGbnNm._text, // 당선 횟수
},
};
// 실제 데이터를 넣는 부분
docClient.put(params, function (err, data) {
if (err) {
console.log(err);
}
});
}
console.log("저장 완료");
}
);
});
app.listen(3000, console.log("Server is running..."));
node server.js
조금 이해가 안될거 같은 부분에는 주석을 달아놨으니 보시고 막히는 부분이 있으시다면 댓글 남겨주세요!
🔗 Github 저장소 링크
https://github.com/K-Junyyy/node-DynamoDB
반응형
'🟩Node.js' 카테고리의 다른 글
[Node.js] socket.io 관련 코드 (0) | 2021.11.05 |
---|---|
[Node.js] mongoose로 mongoDB 조작하기 (0) | 2021.11.04 |
[Node.js] HTML을 Parse 하여 웹 정보 크롤링하기 (6) | 2021.04.24 |
[Node.js] PM2로 Node.js 프로세스 편하게 관리하기 (2) | 2021.04.08 |
[Node.js] GET, POST 방식 요청 처리하기 (HTML form에서 데이터 받기) (1) | 2021.04.03 |