네이버 지식iN 에 어떤 분이 질문글을 올렸습니다.
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040102&docId=295619281

국민재난안전포털의 웹 페이지를 파싱(사실은 크롤링이죠)하는 방법을 문의하셨는데, 처음엔 단순히 웹 페이지를 긁으려는 건가 싶어 "HtmlAgilityPack 를 사용하세요." 라고 답변을 드렸고, 채택도 해 주셨는데, 구체적으로 아래 게시판의 내용을 읽고 싶다고 재차 질문을 주셨습니다.

http://www.safekorea.go.kr/idsiSFK/679/menuMap.do?w2xPath=/idsiSFK/wq/sfk/cs/csc/bbs_conf.xml&bbs_no=63

짤방은 국민재난안전포털의 로고


페이지 소스를 살펴 보았습니다. onload 에서 어떠한 자바스크립트 메서드를 콜 하는 것 외에는 아무것도 없더군요. 아마도 JSON 자료인가, 판단이 들어 Fiddler 를 켜서 데이터가 움직이는 걸 살펴 보았습니다.



Fiddler를 통해 본 전체 데이터



금방 나옵니다.

주소 : http://www.safekorea.go.kr/idsiSFK/bbs/user/selectBbsList.do
컨텐트타입 : application/json
메서드 : POST
데이터 : { 로 시작하는 JSON 데이터 블라블라

대충 자료 구성해서 Fiddler로 날려 보니 자료 잘 나옵니다. 답변을 달려 했으나, 추가질문의 경우 댓글 형태로 밖에 달 수 없어 겸사겸사 블로그에 글 남깁니다.

먼저 사용할 어셈블리(using) 아래와 같습니다.

using System.Net;
using System.Text;
using System.IO;
using System.Web.Script.Serialization; //System.Web.Extensions.dll 을 참조추가 해야 합니다.


JSON 자료를 받으려면, 클래스를 먼저 만들어 놓으면 Deserialize 하기가 편합니다.

public class SafeKorea
{
    public BBS_ListItem[] bbsList
    {
        get;
        set;
    }
}

public class BBS_ListItem
{
    public string last_modf_dt { get; set;  }
    public string cn { get; set; }
}

실제로 리턴되는 JSON 자료는 아래 캡처와 같이 이것저것 많습니다만, 제 생각엔 단순히 일시 및 내용만 필요할 것 같아 Deserialize 할 객체(Class)는 단순하게 만들었습니다.


호출하고 리턴하는 메서드 입니다.

public static BBS_ListItem[] DownloadData1()
{
    var request = (HttpWebRequest)WebRequest.Create("http://www.safekorea.go.kr/idsiSFK/bbs/user/selectBbsList.do");

    var postData = "{\"bbs_searchInfo\":{\"pageIndex\":\"1\",\"pageUnit\":\"10\",\"pageSize\":295,\"firstIndex\":\"1\",\"lastIndex\":\"1\",\"recordCountPerPage\":\"10\",\"bbs_no\":\"63\",\"bbs_ordr\":\"\",\"use\":\"\",\"opCode\":\"\",\"search_type_v\":\"1\",\"search_val_v\":\"\",\"search_key_n\":\"\",\"search_notice\":\"\",\"search_use\":\"\",\"search_permits\":\"\",\"search_disaster_a\":\"\",\"search_disaster_b\":\"\",\"search_amendment\":\"\",\"search_start\":\"\",\"search_end\":\"\"}}";
    var data = Encoding.UTF8.GetBytes(postData);

    request.Method = "POST";
    request.ContentType = "application/json";
    request.ContentLength = data.Length;

    using (var stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }

    var response = (HttpWebResponse)request.GetResponse();
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        var responseString = sr.ReadToEnd();
        JavaScriptSerializer js = new JavaScriptSerializer();
        var safeKorea = js.Deserialize<safekorea>(responseString);

        return safeKorea.bbsList;
    }
}


호출해서 메인 메서드에서 콘솔에 뿌려 봅니다.

var list = DownloadData1();

foreach (var item in list)
{
    Console.WriteLine("--------------------------------------------");
    Console.WriteLine(string.Format("일시 : {0}", item.last_modf_dt));
    Console.WriteLine(string.Format("{0}", item.cn));
}

Console.ReadLine();


결과 콘솔 화면 입니다. 발송지역도 뜨네요. 이 부분은 전체가 텍스트라서 정규식 등으로 꺼내야 합니다.


사용된 건, WebRequest 날리는 방법, JSON.Net 없이 JSON String 을 Deserialize 하는 방법(.NET Framework 4.5 필요) 정도 입니다.

.NET Framework 4.5 환경이 아닐 경우, 3rd party JSON 라이브러리인 JSON.Net 을 사용하면 됩니다. (아마도 System.Web.Extensions 내부에 JSON.Net 이 녹아 있을 지도... 아마 거의 그럴 겁니다. MVC에서도 실질적으로 JSON.Net 이 package로 들어 가니까요.)




출처 : 


https://boring-text.blogspot.kr/2018/02/safekorea-json-data-parsing-csharp.html 


'C# 낙서' 카테고리의 다른 글

이미지 찍기  (0) 2018.07.20
c# contains 문자 포함 여부 확인하기  (0) 2018.05.14
Wireshark를 이용한 패킷 분석  (1) 2018.03.04
Excel 파일 열기 + 시트와 셀 값 가져오기  (0) 2018.02.18
OpenFileDialog  (0) 2018.02.14

+ Recent posts