Today_I_Learned
펀드기준가격 스크레이핑을 위한 AWS 람다 함수(Node)
CONCAT
2024. 8. 13. 14:43
728x90
펀드 기준가는 위 화면에서 검색할 수 있다. 검색하고 상세 보기하면 아래와 같이 뜬다.
여기서 기준가만 받아오고 싶은데 실시간으로 받을 수 있는 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을 판다.
포스트맨으로도 테스팅해준다.
이제 실시간으로 펀드 가격을 받을 수 있다.