[Splunk] Export 방법

1. Index 기준으로 table로 원하는 필드를 선택하여 outputcsv 방법
- 장점 : 빠른 작업이 가능하다.
- 단점 : 기존 로그의 timestamp 가 잘못되어 있어 동일하게 잘못된 timestamp를 사용하게 된다.필드가 정확히 찝혀 있지 않아 놓치는 부분이 있을수 있고, 기존 사용하던 raw 데이터와 형태의 변경이 발생한다. 기존 dashboard 에서 source로 검색된 부분을 다 수정해야 하는 어려움이 있다.

2. Source 기준으로 Raw data dump 방법
- 장점 : 기존에 잘못된 부분을 수정하여 인덱싱 가능하며, 기존 사용하던 raw data와 동일하여 dashboard, 필드, 등 모든설정을 그대로 사용가능하다.
- 단점 : dump 시간이 매우 오래 걸린다.

3. Source 기준으로 table로 원하는 필드를 선택하여 outputcsv 방법
- 장점 : 비교적 빠른 작업이 가능하며, 기존에 사용하던 dashboard를 수정없이 사용 가능하다.
- 단점 : 기존 로그의 timestamp 가 잘못되어 있어 동일하게 잘못된 timestamp를 사용하게 되며, 필드가 정확히 찝혀 있지 않아 놓치는 부분이 있을 수 있다. 기존 사용하던 raw 데이터와 형태의 변경이 있다.

네이티브 앱과 하이브리드 앱

하이브리드 앱의 장점은 플랫폼을 가리지 않고 쉽게 적용할 수 있다는 것이다. 이것만 믿고 하이브리드 방법을 채택해서 앱 개발을 하고 있는데, 장점이 좋은 만큼 단점도 분명히 존재한다.

하이브리드 앱의 단점은 1) 모든 개발을 HTML과 Javascript로 끝내야 한다는 것이다. 서비스 앱의 경우 이것은 매우 치명적이다. 왜냐면 네이티브 앱 개발 플랫폼에서 제공하는 손쉬운 기능들을 모두 직접 HTML과 Javascript로 개발을 해야 하기 때문이다.

그리고 또 하나의 단점은 2) 별도 서버 프로그램을 개발해야 한다는 것이다.HTML과 Javascript는 Client가 되고, 서비스 수행을 위한 API를 제공하는 서버 프로그램이 필요하다. 따라서 2중 개발을 해야 한다.

기존에 Spring Framework으로 웹 개발을 할 때는 정말 불편한 일이다.

웹 크롤러 개발하기

웹 크롤이란

웹 크롤이란 인터넷 상의 원격에 존재하는 웹 문서를 가져오는 수집행위이며, 웹 크롤러란 그러한 행위를 할 수 있는 프로그램을 말한다. 이와 유사한 용어로는 웹 로봇, 웹스파이더 등이 유사하게 사용되고 있다.

웹 크롤러는 인터넷에 존재하는 방대한 양의 문서를 수집해서 빠르게 검색할 수 있도록 구조화 색인 하는 검색엔진의 일부로써 유용하게 사용이 되어 왔다.

인터넷 상의 웹문서가 아래 그림과 같이 기하급수적으로 증가1, 2)함에 따라 웹문서가 담고 있는 유용한 정보도 함께 기하급수적으로 늘어나게 되었다. 따라서 검색엔진은 더 정확한 정보를 제공하기 위해서 웹문서를 보다 더 정교하게 구조화할 필요가 생겼고, 빅데이터가 화두가 된 최근엔 웹은 금맥이며 크롤러 및 IE(Information Extraction) 기술은 금을 캐는 도구와 같다. 따라서 이 기술에 따라서 같은 시간이라도 활용할 수 있는 정보의 질과 양이 달라지게 된다. 

 

수집 대상(웹문서)의 종류

인터넷 상에 조재하는 수집 대상이 되는 정보는 정말 다양한 형태로 존재하고 있다. 하지만 실습을 위해서 HTML 웹 문서웹 API 두가지 종류로 구분해 보자.

HTMl 웹문서

HTML 웹문서3)는 하이퍼텍스트 마크업 언어(HyperText Markup Language)로 만든 웹문서를 말한다. HTML은 제목, 단락, 목록 등과 같은 본문을 위한 구조적 의미를 나타내는 것뿐만 아니라 링크, 인용과 그 밖의 항목으로 구조적 문서를 만들 수 있는 방법을 제공하기 때문에, 이를 이해하고 수집을 하면 쉽게 정보를 수집할 수 있다. 또한 인터넷 브라우져에서 보고 있는 모든 웹페이지가 수집 대상이 될 수 있는 것이다.

하지만, 무작정 HTML 웹페이지를 수집하는 행위는 해당 웹페이지의 서버에 부하를 주기 때문에 로봇 배제 표준4)에 대한 Guide에 따라서 수집을 해야만 한다.

웹 API

먼저 API(Application Programming Interface)란 운영 체제나 프레임워크에서 제공하는 기능을 제어할 수 있도록 만든 인터페이스를 의미한다. 웹 API는 웹 애플리케이션 (웹서비스)가 데이터 및 기능을 사용할 수 있도록 제공하는 인터페이스를 말한다. 대표적인 구글 Maps API를 이용하면 실제 지도 이미지를 가지고 있지 않아도 지도 서비스 개발이 가능하며, 페이스북의 로그인 API를 이용하면 실제 회원정보를 가지고 있지 않아도 접속자에 대해서 인증 기능을 사용할 수 있는 것이다.

 

실습

간단하게 Java를 이용해서 간단한 웹페이지를 수집해보자. 웹수집을 하기전에는 필요한 정보가 무엇이고 해당 정보가 잘정리된 웹 문서나 API가 무엇인지 사전 조사가 필요하다. 

먼저 HTML 문서를 수집하는 방법을 알아보자. 요즘은 Jsoup이나 Jericho HTML Parser 이 두 가지 라이브러리를 많이 이용하는 것 같다.이 두가지 모두 HTML 문서를 문자열 형태로 전달해서 파싱할 수 있다.

예제 HTML

위키피디아 서울특별시 페이지에 들어가면, 화면 오른쪽에 서울특별시에 대한 요약정보가 보인다.

아래의 Table은 그 요약 정보중에서 인구 정보에 해당하는 HTML이다. 이 HTML에서 우리는 서울의 인구가 10,103,230명이라는 정보를 수집할 것이다.

HTML에서 먼저 파악해야 할 것이 필요한 정보를 감싸고 있는 상위 Tag이다. 10,103, 230명을 감싸고 있는 태그는 td → tr → table → div이다.

<div id=”mw-content-text” lang=”ko” dir=”ltr” class=”mw-content-ltr”>
<table class=”infobox geography vcard” cellspacing=”3″ style=”border-spacing: 3px; width:22em; width:22em; font-size:85%; line-height: 1.4em;”>
<tr class=”mergedrow”>
<th scope=”row” style=”text-align:left;”><a href=”/wiki/%EC%9D%B8%EA%B5%AC%EB%B0%80%EB%8F%84″ title=”인구밀도” class=”mw-redirect”>인구밀도</a></th>
<td class=”” style=””>16,726 명/km</td>
</tr>
<tr class=””>
<th scope=”row” style=”text-align:left;”><a href=”/wiki/%EC%9D%B8%EA%B5%AC%EC%88%9C_%EB%8F%84%EC%8B%9C_%EB%AA%A9%EB%A1%9D” title=”인구순 도시 목록”>인구</a></th>
<td class=”population” style=””>10,103,230 명</td>
</tr>
<tr class=”mergedrow”>
<th scope=”row” style=”text-align:left;”>광역인구</th>
<td class=”” style=””>25,323,691 명</td>
</tr>
</table>
</div>

 

Jsoup

Jsoup은 HTML의 DOM 구조와 CSS의 class 기반으로 검색이 가능하다.  (Jsoup 문법)

  1. public static void getPopulation1(String html) {
  2.     Document doc = Jsoup.parse(html);
  3.     // 상위부터 이와 같은 Tag 구조의 html을 가져온다.
  4.     Elements elements = doc.select("div table tr td");
  5.     for (int i=0; i<elements.size(); i++) {
  6.         Element element = elements.get(i);
  7.         if (i==1) {
  8.             // div table tr td 중에서 두 번째 위치한 값을 가져온다.
  9.             System.out.println( element.html() );
  10.         }
  11.     }
  12. }
  13. public static void getPopulation2(String html) {
  14.     Document doc = Jsoup.parse(html);
  15.     // 상위부터 이와 같은 Tag 구조의 html을 가져온다.
  16.     Elements elements = doc.select("div table tr td");
  17.     // div table tr td 중에서 두 번째 위치한 값을 가져온다.
  18.     System.out.println( elements.get(1).ownText() );
  19. }
  20. public static void getPopulation3(String html) {
  21.     Document doc = Jsoup.parse(html);
  22.     // html 중에서 td의 구조를 모두 가져온다.
  23.     Elements elements = doc.select("td");
  24.     for (int i=0; i<elements.size(); i++) {
  25.         Element element = elements.get(i);
  26.         // td의 구조 중에서 class
  27.        
  28.         if (element.attr("class").equals("population")) {
  29.             System.out.println( element.html() );
  30.         }
  31.     }
  32. }

 

Jericho HTML Parser

Jericho HTML Parser는 XML 사용하듯이 사용한다. 

  1. public static void getPopulation1(String html) {
  2.     Source source = new Source(html);
  3.     // TD 태그의 모든 html을 가져온다.
  4.     List<Element> elements = source.getAllElements(HTMLElementName.TD);
  5.     for (int i=0; i<elements.size(); i++) {
  6.         Element element = elements.get(i);
  7.         if (i==1) {
  8.             // 모든 TD 중에서 두 번째 위치한 값을 가져온다.
  9.             System.out.println( element.getTextExtractor().toString() );
  10.         }
  11.     }
  12. }
  13. public static void getPopulation2(String html) {
  14.     Source source = new Source(html);
  15.     // classname이 "population인 모든 html을 가져온다.
  16.     List<Element> elements = source.getAllElementsByClass("population");
  17.     // 이 중에서 첫 번째 위치한 값을 가져온다.
  18.     System.out.println( elements.get(0).getTextExtractor().toString() );
  19. }
  20. public static void getPopulation3(String html) {
  21.     Source source = new Source(html);
  22.     // classname이 "population인 모든 html 중에서 첫번째 HTML 영역을 가져온다.
  23.     Element element = source.getFirstElementByClass("population");
  24.     // 값을 출력한다.
  25.     System.out.println( element.getTextExtractor().toString() );
  26. }

 

참고

  1. 그래프로 보는 인터넷 발달사 
  2. How we got from 1 to 162 million websites on the internet
  3. 위키피디아 HTML
  4. 위키피디아 로봇 배제 표준