■ KRX 주식 시세 데이터를 구하는 방법을 보여준다.
▶ KRXHelper.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
using System.IO; using System.Net; using System.Text; namespace TestProject { /// <summary> /// KRX 헬퍼 /// </summary> public static class KRXHelper { ////////////////////////////////////////////////////////////////////////////////////////////////////////////// Field //////////////////////////////////////////////////////////////////////////////////////////////////// Static ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 주식 데이터 생성 쿼리 문자열 포맷 /// </summary> /// <remarks> /// mktId : ALL(전체), STK(KOSPI), KSQ(KOSDAQ), KNX(KONEX) /// share : 1(주), 2(천주), 3(백만주) /// </remarks> private static string GENERATE_STOCK_DATA_QUERY_STRING_FORMAT = "mktId=ALL&share=1&csvxls_isNo=false&" + "name=fileDown&url=dbms/MDC/STAT/standard/MDCSTAT01901"; /// <summary> /// 업종 데이터 생성 쿼리 문자열 포맷 /// </summary> /// <remarks> /// mktId : STK(KOSPI), KSQ(KOSDAQ) /// trdDd : 조회일자 /// money : 1(원), 2(천원), 3(백만원), 4(십억원) /// </remarks> private static string GENERATE_SECTOR_DATA_QUERY_STRING_FORMAT = "mktId={0}&trdDd={1}&money=1&csvxls_isNo=false&" + "name=fileDown&url=dbms/MDC/STAT/standard/MDCSTAT03901"; /// <summary> /// 주식 시세 데이터 생성 쿼리 문자열 포맷 /// </summary> /// <remarks> /// mktId : ALL(전체), STK(KOSPI), KSQ(KOSDAQ), KNX(KONEX) /// trdDd : 조회일자 /// share : 1(주), 2(천주), 3(백만주) /// money : 1(원), 2(천원), 3(백만원), 4(십억원) /// </remarks> private static string GENERATE_STOCK_PRICE_DATA_QUERY_STRING_FORMAT = "mktId=ALL&trdDd={0}&share=1&money=3&csvxls_isNo=false&" + "name=fileDown&url=dbms/MDC/STAT/standard/MDCSTAT01501"; /// <summary> /// 주식 시세 데이터 생성 URL /// </summary> private static string GENERATE_DATA_URL = "http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd"; /// <summary> /// 주식 시세 데이터 다운로드 쿼리 문자열 포맷 /// </summary> private static string DOWNLOAD_DATA_QUERY_STRING_FORMAT = "code={0}"; /// <summary> /// 주식 시세 데이터 다운로드 URL /// </summary> private static string DOWNLOAD_DATA_URL = "http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd"; #endregion ////////////////////////////////////////////////////////////////////////////////////////////////////////////// Method //////////////////////////////////////////////////////////////////////////////////////////////////// Static ////////////////////////////////////////////////////////////////////////////////////////// Public #region 주식 데이터 구하기 - GetStockData() /// <summary> /// 주식 데이터 구하기 /// </summary> /// <returns>주식 데이터</returns> public static string GetStockData() { string generateQueryString = GENERATE_STOCK_DATA_QUERY_STRING_FORMAT; string generateResponseString = RequestData(GENERATE_DATA_URL, generateQueryString); string downloadQueryString = string.Format(DOWNLOAD_DATA_QUERY_STRING_FORMAT, generateResponseString); string downloadResponseString = RequestData(DOWNLOAD_DATA_URL, downloadQueryString); return downloadResponseString; } #endregion #region 업종 데이터 구하기 - GetSectorData(marketID, baseDateString) /// <summary> /// 업종 데이터 구하기 /// </summary> /// <param name="marketID">시장 ID</param> /// <param name="baseDateString">기준일 문자열</param> /// <returns>주식 데이터</returns> public static string GetSectorData(string marketID, string baseDateString) { string generateQueryString = string.Format(GENERATE_SECTOR_DATA_QUERY_STRING_FORMAT, marketID, baseDateString); string generateResponseString = RequestData(GENERATE_DATA_URL, generateQueryString); string downloadQueryString = string.Format(DOWNLOAD_DATA_QUERY_STRING_FORMAT, generateResponseString); string downloadResponseString = RequestData(DOWNLOAD_DATA_URL, downloadQueryString); return downloadResponseString; } #endregion #region 주식 시세 데이터 구하기 - GetStockPriceData(baseDateString) /// <summary> /// 주식 시세 데이터 구하기 /// </summary> /// <param name="baseDateString">기준일 문자열</param> /// <returns>주식 시세 데이터</returns> public static string GetStockPriceData(string baseDateString) { string generateQueryString = string.Format(GENERATE_STOCK_PRICE_DATA_QUERY_STRING_FORMAT, baseDateString); string generateResponseString = RequestData(GENERATE_DATA_URL, generateQueryString); string downloadQueryString = string.Format(DOWNLOAD_DATA_QUERY_STRING_FORMAT, generateResponseString); string downloadResponseString = RequestData(DOWNLOAD_DATA_URL, downloadQueryString); return downloadResponseString; } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region HTTP 웹 요청 구하기 - GetHttpWebRequest(url) /// <summary> /// HTTP 웹 요청 구하기 /// </summary> /// <param name="url">HTTP 웹 요청</param> private static HttpWebRequest GetHttpWebRequest(string url) { HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Host = "data.krx.co.kr"; request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"; request.Referer = "http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201020101"; request.Method = WebRequestMethods.Http.Post; request.Accept = "text/plain, */*; q=0.01"; request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; request.KeepAlive = true; request.SendChunked = true; request.Headers.Add(HttpRequestHeader.AcceptLanguage, "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"); request.Headers.Add("X-Requested-With" , "XMLHttpRequest" ); request.Headers.Add("Origin" , "http://data.krx.co.kr" ); return request; } #endregion #region 데이터 요청하기 - RequestData(url, requestString) /// <summary> /// 데이터 요청하기 /// </summary> /// <param name="url">URL</param> /// <param name="requestString">요청 문자열</param> /// <returns>응답 문자열</returns> private static string RequestData(string url, string requestString) { byte[] requestByteArray = Encoding.UTF8.GetBytes(requestString); HttpWebRequest request = GetHttpWebRequest(url); request.ContentLength = requestByteArray.Length; using(Stream requestStream = request.GetRequestStream()) { requestStream.Write(requestByteArray, 0, requestByteArray.Length); } using(HttpWebResponse response = request.GetResponse() as HttpWebResponse) { using(Stream stream = response.GetResponseStream()) { using(StreamReader streamReader = new StreamReader(stream, Encoding.Default)) { string responseString = streamReader.ReadToEnd(); return responseString; } } } } #endregion } } |
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using System; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { string stockData = KRXHelper.GetStockData(); Console.WriteLine(stockData); string kospiSectorData = KRXHelper.GetSectorData("STK", "20220330"); Console.WriteLine(kospiSectorData); string kosdaqSectorData = KRXHelper.GetSectorData("KSQ", "20220330"); Console.WriteLine(kosdaqSectorData); string stockPriceData = KRXHelper.GetStockPriceData("20220330"); Console.WriteLine(stockPriceData); } #endregion } } |