Today_I_Learned

펀드기준가격 스크레이핑을 위한 AWS 람다 함수(Node)

CONCAT 2024. 8. 13. 14:43
728x90

데이터 출처 : https://dis.kofia.or.kr/websquare/index.jsp?w2xPath=/wq/fundann/DISFundStdPrice.xml&divisionId=MDIS01004001000000&serviceId=SDIS01004001000

펀드 기준가는 위 화면에서 검색할 수 있다. 검색하고 상세 보기하면 아래와 같이 뜬다.

여기서 기준가만 받아오고 싶은데 실시간으로 받을 수 있는 API가 없다.

네트워크 탭에서 잘 비벼보면 XML로 된 API가 있다. URI와 헤더, 페이로드를 딴다.

Node로 세팅한 AWS Lambda 함수를 하나 판다.

export const handler = async (event) => {
  const { fundCd } = JSON.parse(event.body);
  const fundPrice = await fetchFundPrice(fundCd);
  const response = {
    statusCode: 200,
    body: JSON.stringify({ fundCd, fundPrice }),
  };
  return response;
};

async function fetchFundPrice(fundCd) {
  const url = "https://dis.kofia.or.kr/proframeWeb/XMLSERVICES";
  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'text/xml'
    },
    body: `<?xml version="1.0" encoding="utf-8"?>
            <message>
              <proframeHeader>
                <pfmAppName>FS-COM</pfmAppName>
                <pfmSvcName>COMFundUnityBasInfoSO</pfmSvcName>
                <pfmFnName>fundStdcotInfoSrch</pfmFnName>
              </proframeHeader>
              <systemHeader></systemHeader>
              <COMFundUnityInfoInputDTO>
                <standardCd>${fundCd}</standardCd>
                <companyCd></companyCd>
                <standardDt></standardDt>
              </COMFundUnityInfoInputDTO>
            </message>`
  };
  const response = await fetch(url, options);
  const text = await response.text();
  const match = text.match(/<standardCot>([\d.]+)<\/standardCot>/);
  return match ? Number.parseFloat(match[1]) : null;
}

XML 파싱을 위한 라이브러리를 깔아도 되지만, 정규표현식으로 대체한다.

{
  "body": "{\"fundCd\": \"K55105BU1112\"}"
}

내부 테스트해준다.

구성 > 함수 URL > 함수 URL 생성으로 URL을 판다.

포스트맨으로도 테스팅해준다.

이제 실시간으로 펀드 가격을 받을 수 있다.