반응형

 

🚀

이번 포스팅은 공공데이터 포털에서 제공하는 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

 

GitHub - K-Junyyy/node-DynamoDB

Contribute to K-Junyyy/node-DynamoDB development by creating an account on GitHub.

github.com

 

반응형

+ Recent posts