Sep 172012
 

DNS는 HTML과 달리 정해진 형식으로 구성된 프로토콜입니다.

워낙 작은 데이타로 값을 요청하고, 응답해야 하기 때문에 나름대로의 규칙이 있습니다.

특히 응답값을 패킷 캡쳐를 해서 보면 재미있는 현상이 있습니다.
실제 결과를 nslookup이나 dig를 통해서 결과를 보면 데이타의 양이 많습니다. 하지만 많은 양에 비해서 패킷의 수치는 그리 많지 않습니다.

이를 처리하는 부분이 도메인 데이타에 대해서 압축(?)을 하는 방법을 사용합니다. 우리가 일반적으로 알고 있는 압축이 아니고, 이미 사용했던 패킷의 데이타를 재사용함으로써 데이타 압축을 한 효과를 내고 있습니다.

RFC에서 DNS 프로토콜에서 데이타 압축 기법에 대한 설명 자료

http://tools.ietf.org/html/rfc1035#section-4.1.4

이러한 기법에 대해서 설명한 자료를 찾지 못해서 RFC와 패킷 캡쳐한 결과로만 알고 있다가 예전에 인터넷으로 검색해서 찾은 자료입니다. 예전같으면 원서라도 구입해서 보겠지만, 요새는 인터넷에서 원서를 공개하고 있어서 원하는 부분만 쉽게 볼수 있어서 좋은것 같습니다.

http://www.tcpipguide.com/free/t_DNSNameNotationandMessageCompressionTechnique.htm

위의 TCP/IP Guide 책을 보면 RFC보다 쉽게 이해가 가능합니다.

하지만 이러한 사실을 눈으로는 쉽게 이해가 되지만, 이를 구현을 하다 보면 여러가지 문제점이 있다는 것을 알수 있습니다.
구현에 대해서는 다음에 다시 한번 정리를 해보도록 하겠습니다.

Sep 172012
 

대부분 개발자들은 개발을 하면서 HTML 파서를 각자 만들어서 사용을 하고 있습니다.
특히 검색 로봇을 만들어서 사용할 경우에는 HTML을 읽어서 파서를 만들어서 사용하는 경우가 많습니다.
그래서 저는 HTML 문법을 기반으로 하는 라인단위로 분리를 해서 사용하는 방법을 많이 사용했습니다.
(대부분 로봇을 Perl을 사용해서 만들었기 때문에 10라인 정도 되는 함수로 만들어서 잘 사용했으며, 대규모 분석시 적은 메모리로 빠른 처리가 가능합니다.)

하지만 최근 HTML 구조가 CSS 기반으로 이루어지다 보니 좀 더 복잡하게 구성되는 경우가 많습니다.
대신 HTML5의 경우에는 문서가 구조적으로 되어 있기 때문에 라인단위로 분석보다는 html을 parser해서 DOM과 같은 객체에 넣어 두고 분석을 하면 훨씬 편리하다.

물론 라인단위로 처리하거나, SAX로 처리하는 것보다 메모리나, 속도 측면에서는 문제가 많겠지만, 변경된 HTML구조에 빠르게 대응을 하고, 간단하게 개발할때에는 효과적인것 같아서 HTML parser 프로그램을 하나 소개합니다.

PHP로 되어 있으며, 간단히 라이브러리 파일만 include를 하고, 아래와 같이 사용하면 된다.
(PHP 기본 함수가 아니므로 아래 참고 URL에 있는 소스를 다운받아서 PHP 프로그램을 사용할때 추가해야 합니다.)

    include_once('simple_html_dom.php');
 
    $html = file_get_html("http://blog.sukmoonlee.com");
 
    foreach($html->find('ul') as $element) {
        foreach($element->find('a') as $e) {
            echo $e->href."\n";        
        }
    }
 
 
[smlee@localhost ~]$ php test.php
/wordpress/
/env.php
/geshi/contrib/example.php

참고URL: http://simplehtmldom.sourceforge.net/

Plugin from the creators of Brindes :: More at Plulz Wordpress Plugins