메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

PHP로 실질적인 데이터 마이닝과 구문 분석 탐색하기

PHP로 유용한 정보를 찾기 위해 XML 및 HTML 데이터 살펴보기

Eli White, CTO, MojoLive
Eli White
Eli White는 현재 MojoLive의 CTO이고, 16년 이상 동안 웹 애플리케이션 제작에 대한 일을 해왔으며 지난 10년간은 PHP 프로젝트만 독점으로 작업했다. 그는 Zend, TripAdvisor, Digg 및 Hubble SpaceTelescope Program 등에서 직무를 포함하여 과거에 다양한 많은 일들을 해왔다. 그는 "PHP 5 in Practice"의 저자이자 강연의 정기적인 연사로 참여한다.

요약:  데이터 마이닝의 기술은 폭넓은 분야이며, 이러한 용어를 두 명의 다른 개발자에게 언급하면 이에 대해 두 가지의 매우 다른 개념을 제시합니다. 이 기사에서는 데이터 마이닝의 개념과 중요성, 데이터 마이닝을 달성하기 위한(또는 웹 기반 데이터 마이닝 도구를 작성하기 위한) 다른 방법들을 배우고 PHP 기술의 다른 데이터 및 XML을 구문 분석하기 위해 XML 구조에 대한 이해의 폭을 향상시켜 줍니다.

기사 게재일:  2011 년 10 월 25 일
난이도: 초급 원문:  보기 PDF:  A4 and Letter (299KB | 17 pages)Get Adobe® Reader®
페이지뷰:  1811 회
의견:  


데이터 마이닝과 그 중요성

자주 사용하는 약어

  • API: Application programming interface
  • CDATA: Character data
  • DOM: Document Object Mode
  • FTP: File Transfer Protocol
  • HTML: HyperText Markup Language
  • HTTP: Hypertext Transfer Protocol
  • REST: Representational State Transfer
  • URL: Uniform Resource Locator
  • W3C: World Wide Web Consortium
  • XML: Extensible Markup Language

위키피디아에서는 데이터 마이닝을 "통계와 인공 지능에서 나온 메소드를 데이터베이스 관리와 결합하여 대규모 데이터 세트로부터 패턴을 추출하는 프로세스"로 정의한다. 이는 매우 심오한 정의이며, 아마도 대부분 사람들의 일반적인 유스 케이스를 넘어설 가능성이 높다. 인공 지능으로 작업하는 사람들의 수는 적다. 반면에, 가장 일반적으로 데이터 마이닝은 대규모 데이터 세트의 수집 및 유용한 정보를 찾기 위해 이를 통한 검색을 간단히 수반한다.

사용 가능한 매우 많은 정보를 통해 인터넷이 어떻게 성장했는지 생각해보면 대용량 데이터를 수집하고 이를 의미있게 만들 수 있는 것은 중요하다. 한 개인이 읽고 유용한 데이터로 조작할 수 있는 것보다 훨씬 더 많은 데이터 세트를 취하는 것이 주된 목표이다. 이 기사는 이러한 데이터 마이닝 유형에 주목하고, 특히 이러한 데이터를 수집하고 구문 분석하는 방법에 주목한다.


데이터 마이닝의 실질적인 사용

데이터 마이닝은 실질적인 사용이 많다. 제공하는 정보(영화나 콘서트의 관객 기록 등)에 대한 웹 사이트를 찾아 헤매려 할 수 있다. 데이터를 검색하고 의미있게 하기 위해 투표자 기록과 같이 더 중대한 정보가 있을 수 있다. 또는 더 일반적으로는 소셜 네트워크 데이터를 살펴보고 이로부터 경향을 구문 분석하려 할 수 있다. 예를 들어, 독자의 회사가 얼마나 자주 언급되는지 그리고 긍정적 또는 부정적 양상으로 언급되는지 여부 등이다.


웹 사이트를 마이닝하기 전 예방책

필자가 계속 진행하기 전에 다른 웹 사이트로부터 이 데이터를 빼낼 것이라고 가정한다는 것을 언급해야 한다. 이미 독자의 편의대로 데이터를 보유한다면 이는 매우 다른 상황이다. 웹 사이트로부터 데이터를 빼낼 때, 웹 스크래핑(이는 나중에 더 나올 것임) 중인지 아니면 API를 사용 중인지 여부에 관계 없이 서비스 이용 약관에 따르는 중임을 보장해야 한다. 스크래핑하는 중이면 사이트의 robots.txt 파일을 따르는 것에도 신중해야 한다. 이는 액세스할 수 있는 웹 사이트의 스크립트가 어느 부분인지 설명한다. 마지막으로 사이트의 대역폭을 존중해야 한다. 스크립트가 실행할 수 있을 만큼 빠르게 사이트의 데이터에 액세스하는 스크립트를 쓰지 말아야 한다. 이는 호스팅 문제를 야기할 수 있을 뿐만 아니라 너무 공격적이 되어 사이트로부터 금지되거나 차단될 위험을 무릅쓰는 것이다.


XML 데이터 구조 이해하기

데이터를 빼내는 방식에 관계 없이 XML(또는 HTML) 형식으로 데이터를 수신할 것이라는 가능성이 있다. XML은 데이터를 공유하는 측면에서 인터넷의 표준 언어가 되었다. 이를 검색하기 위해 메소드를 살펴보기 전에 XML 구조 및 PHP로 이를 처리하는 방법을 간략히 고려하는 것이 중요하다.

XML 문서의 기본 구조는 특히, 독자가 이전에 HTML로 작업한 경험이 있다면 매우 간단하다. XML 문서의 모든 데이터는 두 가지 방법 중 하나로 저장된다. 데이터를 저장하는 1차적인 방법은 중첩된 태그 내에 존재하는 것이다. 가장 간단한 형태의 예제의 경우 주소가 있다고 가정하면 이는 다음과 같이 문서에 저장될 수 있다.

<address>1234 Main Street, Baltimore, MD</address>

여러 주소 목록을 작성하기 위해 이러한 XML 데이터 지점을 중첩할 수 있다. 이러한 모든 주소를 또 다른 태그 내에 놓을 수 있으며, 이 경우에 locations라고 한다(목록 1 참조).


목록 1. XML의 복수 주소

<locations>
    <address>1234 Main Street, Baltimore, MD</address>
    <address>567 1st Street, San Jose, CA</address>
    <address>901 Washington Ave, Chicago, IL</address>
</locations>

이러한 접근방식을 한층 더 확장하기 위해 해당 주소를 거리, 도시 및 주의 구성 부분으로 나누려 할 수 있으며, 이렇게 하면 데이터의 처리가 더 간편해진다. 이러한 경우에 목록 2와 같이 더 일반적인 XML 파일을 가진다.


목록 2. XML에서 완전히 나누어진 주소들

<locations>
    <address>
        <street>1234 Main Street</street>
        <city>Baltimore</city>
        <state>MD</state>
    </address>
    <address>
        <street>567 1st Street</street>
        <city>San Jose</city>
        <state>CA</state>
    </address>
    <address>
        <street>901 Washington Ave</street>
        <city>Chicago</city>
        <state>IL</state>
    </address>
</locations>

언급한 것처럼 XML 데이터를 두 가지 기본적인 방법으로 저장할 수 있다. 이제 그 중 한 가지만 확인했다. 다른 방법은 속성을 사용하는 것이다. 각 태그는 이에 지정된 속성의 수를 보유할 수 있다. 이 접근방식은 일반적이지 않은 반면, 매우 유용한 도구가 될 수 있다. 때로는 이는 고유 ID 또는 이벤트 날짜와 같이 추가 정보를 제공한다. 매우 많은 경우에 이는 메타 데이터를 추가한다. 즉, 주소 예제에서 type 속성은 해당 주소가 집인지 또는 직장 주소인지 여부를 표시하며, 이는 목록 3에 나타난다.


목록 3. XML로 추가된 태그

<locations>
    <address type="home">
        <street>1234 Main Street</street>
        <city>Baltimore</city>
        <state>MD</state>
    </address>
    <address type="work">
        <street>567 1st Street</street>
        <city>San Jose</city>
        <state>CA</state>
    </address>
    <address type="work">
        <street>901 Washington Ave</street>
        <city>Chicago</city>
        <state>IL</state>
    </address>
</locations>

XML 문서는 항상 모든 다른 태그/노드가 하위인 상위 루트 태그/노드를 보유하는 것을 참고하자. XML은 문서의 시작에서 다른 선언과 정의 및 몇 가지 다른 복잡한 문제들을(예: CDATA 블록) 포함할 수도 있다. 필자는 독자가 참고자료에서 XML에 대해 더 많이 읽어보기를 강력하게 권장한다.


PHP에서 XML 데이터 구문 분석

이제 XML의 모양과 어떻게 구성되었는지 이해했으니 구문 분석하여 PHP 내에서 해당 데이터에 프로그래밍 방식으로 액세스하는 방법을 알아야 한다. PHP에 대해 작성된 많은 라이브러리는 XML 구문 분석을 허용하고, 각 라이브러리는 자체적인 혜택과 단점을 보유한다. DOM, XMLReader/Writer, XML Parser, SimpleXML 및 기타 등등이 있다. 이 기사의 목적상 필자는 가장 일반적으로 사용되는 라이브러리이자 필자가 가장 선호하는 라이브러리 중 하나로서 SimpleXML에 주목한다.

이름이 제시하는 대로 SimpleXML은 XML을 액세스하는 면에서 매우 간단한 인터페이스를 제공하기 위해 작성되었다. 이는 XML 문서를 취하여 내부 PHP 오브젝트 형식으로 변환한다. 데이터 지점에 액세스하는 것은 오브젝트 변수에 액세스하는 것만큼 간단해진다. SimpleXML으로 XML 문서를 구문 분석하는 것은 simplexml_load_file() 함수를 사용하는 것만큼 간단하다(목록 4 참조).


목록 4. SimpleXML로 문서 구문 분석하기

<?php
$xml = simplexml_load_file('listing4.xml');
?>

이는 정말로 필요한 전부이다. PHP의 파일스트림 통합으로 인해 파일 이름 또는 URL을 여기에 삽입할 수 있고 파일스트림 통합이 자동으로 이를 페치하는 것을 참고한다. 이미 XML이 메모리로 로드되었으면 simplexml_load_string()을 사용할 수도 있다. 목록 3의 XML에서 이 코드를 실행하고 print_r()을 사용하여 데이터의 대략적인 구조를 확인하면, 목록 5의 출력이 나온다.


목록 5. 구문 분석된 XML의 출력

SimpleXMLElement Object 
(
     [address] => Array
         (
             [0] => SimpleXMLElement Object
                 (
                     [@attributes] => Array
                         (
                             [type] => home
                         )
                     [street] => 1234 Main Street
                     [city] => Baltimore
                     [state] => MD
                 )
              [1] => SimpleXMLElement Object
                 (
                     [@attributes] => Array
                         (
                             [type] => work
                         )
                     [street] => 567 1st Street
                     [city] => San Jose
                     [state] => CA
                 )
              [2] => SimpleXMLElement Object
                 (
                     [@attributes] => Array
                         (
                             [type] => work
                         ) 
                     [street] => 901 Washington Ave
                     [city] => Chicago
                     [state] => IL
                 )
          )
)

그러면 표준 PHP 오브젝트 액세스와 메소드를 사용하여 데이터에 액세스할 수 있다. 예를 들어, 어떤 사람이 존재하는 모든 상태를 반영하려면 이를 수행하기 위해 주소에 대해 반복할 수 있다(목록 6 참조).


목록 6. 주소에 대해 반복하기

<?php
$xml = simplexml_load_file('listing4.xml');

foreach ($xml->address as $address) {
    echo $address->state, "<br \>\n";
}
?>

속성에 액세스하는 것은 약간 다르다. 오브젝트 특성을 수행하는 것처럼 이를 참조하는 것이 아니라 배열 값과 같이 이에 액세스한다. 목록 7의 코드를 사용하여 type 속성을 보여주기 위해 마지막 코드 샘플을 변경할 수 있다.


목록 7. 속성 추가하기

<?php
$xml = simplexml_load_file('listing4.xml');

foreach ($xml->address as $address) {
    echo $address->state, ': ', $address['type'], "<br \>\n";
}
?>

현재 모든 예제를 반복에 참여시키는 동안, 데이터에 직접 도달하여 코드 $xml->address[1]->street로 두 번째 주소의 거리 주소를 포착하는 것과 같이 원하는 특정 정보의 부분을 사용할 수 있다.

이제 XML 데이터로 흥미롭게 작업을 시작하기 위한 기본 도구를 갖추었다. 필자는 독자가 참고자료에 나열된 SimpleXML 문서와 다른 링크를 읽고 더 학습할 것을 권장한다.


PHP로 데이터 마이닝: 가능한 방법

언급한 것처럼 여러 방식으로 데이터에 액세스할 수 있다. 두 가지 기본 메소드는 웹 스크래핑과 API 사용이다.

웹 스크래핑

웹 스크래핑은 말 그대로 전체 웹 페이지를 프로그래밍 방식으로 다운로드하고 해당 페이지로부터 데이터를 추출하는 행위이다. 이 주제에 대해 전체적으로 저술된 책들이 나와 있다(참고자료 참조). 필자는 이를 수행하기 위해 필요한 도구를 간략히 나열한다. 우선, PHP를 사용하면 문자열로 웹 페이지를 읽기에 매우 간편하게 된다. URL로 file_get_contents() 사용하기 등 이를 수행하는 방법이 많지만, 이 경우에 HTML을 유용한 방식으로 구문 분석할 수 있도록 하려고 한다.

HTML이 XML을 기반으로 하는 언어의 중심에 있다고 생각하면, HTML을 SimpleXML 구조로 변환하는 것이 유용하다. 하지만 올바른 HTML이 XML이 아닌 것처럼 simplexml_load_file()을 사용하여 HTML 페이지를 단순히 로드할 수 없다. 훌륭한 임시 해결책은 DOM 확장을 사용하여 DOM 문서로 HTML 페이지를 로드한 다음에 SimpleXML로 이를 변환하는 것이며, 이는 목록 8에 나와 있다.


목록 8. 웹 페이지의 SimpleXML 버전을 얻기 위해 DOM 메소드 사용하기

<?php
$dom = new DOMDocument();
$dom->loadHTMLFile('http://example.com/');
$xml = simplexml_import_dom($dom);
?>

이를 수행한 후에 이제 다른 XML 문서를 보유할 수 있는 것처럼 HTML 페이지로 횡단할 수 있다. 그러므로 이제 $xml->head->title을 사용하여 페이지의 제목에 액세스하거나 $xml->body->div[0]->div[0]->div[0]->h4[0]과 같은 참조를 사용하여 페이지로 깊게 들어갈 수 있다.

마지막 예제에서부터 예상할 수 있는 것처럼, HTML 페이지의 중앙에서 데이터를 찾기 위해 노력하는 시점에 매우 통제하기 힘들어 질 수 있으며, 이는 많은 경우에 거의 XML 파일인 것처럼 구성되지 않는다. 위의 행은 세 가지 중첩된 div의 내에 존재하는 첫 번째 h4를 찾는다. 각 경우에 이는 각 상위 내의 첫 번째 div를 찾는다.

다행히 해당 페이지에서 첫 번째 h4 또는 이러한 다른 "직접 데이터"만 찾으려는 경우, XPath는 수행하기에 훨씬 더 간편한 방법이다. XPath는 쿼리 언어를 사용하여 XML 문서를 통해 검색하는 근본적인 한 가지 방법이고, SimpleXML은 이를 노출한다. XPath는 매우 강력한 도구이며 참고자료에 나열된 일부를 포함하여 기사의 전체 시리즈의 주제가 될 수 있다. 기본 용어에서 '/'를 사용하여 계층적 관계를 설명한다. 그러므로, 다음 XPath가 검색하는 것처럼 선행 참조를 다시 쓸 수 있다(목록 9 참조).


목록 9. 직접 XPath 사용하기

<?php
$h4 = $xml->xpath('/html/body/div/div/div/h4');
?>

또는 XPath로 '//' 옵션을 사용할 수 있으며, 이는 독자가 찾고 있는 태그에 대해 모든 문서를 검색하도록 한다. 그러므로, 배열로서 모든 h4를 찾은 다음에, 다음과 같이 XPath를 사용하여 첫 번째 h4에 액세스할 수 있다.
'//h4'

HTML 계층 둘러보기(walking)

이러한 변환과 XPath에 대해 논의하는 주된 이유는 웹 스크래핑을 수행할 때 필요한 일반적인 태스크 중 하나가 웹 페이지에서 다른 링크를 자동으로 찾고 이를 따르는 것이며, 웹 사이트 "둘러보기(walking)"를 허용하여 가능한 많은 정보를 찾는 것이다.

이 태스크는 XPath를 사용하는 매우 사소한 것으로 되어 있다. 목록 10은 "href" 속성이 있는 모든 <a> 링크의 배열을 제공하여, 이를 처리하도록 허용한다.


목록 10. 페이지에서 모든 링크를 찾는 기술 결합하기

<?php
$dom = new DOMDocument();
$dom->loadHTMLFile('http://example.com/');
$xml = simplexml_import_dom($dom);
$links = $xml->xpath('//a[@href]');
foreach ($links as $l) {
    echo $l['href'], "<br />\n";
}
?>

코드가 <a href=""> 링크를 찾았지만, 찾은 모든 가능한 링크를 따르는 경우 전체 웹을 크롤링하는 것을 빠르게 시작할 수 있다. 그러므로, 올바른 HTML 링크(FTP 또는 JavaScript 아님)인 링크에만 액세스하고 동일한 웹 사이트로만 돌아가도록(전체 또는 관련 도메인 링크 사용) 보장하기 위해 코드를 향상시키는 것이 최선이다.

더 간편한 방법은 PHP의 내장 parse_url() 함수를 사용하여 링크에서 반복하는 것이며 이는 많은 새너티(sanity) 검사를 처리해준다. 목록 11은 다음과 같다.


목록 11. 더 강력한 사이트 둘러보기

<?php
$dom = new DOMDocument();
$host = 'example.com';
$dom->loadHTMLFile("http://{$host}/");
$xml = simplexml_import_dom($dom);
$links = $xml->xpath('//a[@href]');
foreach ($links as $l) {
    $p = parse_url($l['href']);
    if (empty($p['scheme']) || in_array($p['scheme'], array('http', 'https'))) {
        if (empty($p['host']) || ($host == $p['host'])) {
            echo $l['href'], "<br />\n"; // Handle URL iteration here
        }
    }
}
?>

HTML 구문 분석에서 마지막 참고사항으로서 모든 XML형 언어로 통일된 인터페이스에 대해 SimpleXML로 다시 변환하는 목적만을 위해 DOM 확장을 사용하는 방법을 검토했다. DOM 라이브러리 자체가 매우 강력하고 직접 사용될 수 있음을 참고한다. 독자가 JavaScript에 정통하고 getElementsByTagName과 같은 도구를 사용하여 DOM 문서 트리를 횡단하는 중이면, DOM 라이브러리 내에서 머무르고 SimpleXML을 사용하지 않는 것이 편하다고 느낄 수 있다.

이제 웹 페이지에서부터 데이터 스크래핑을 시작하는 데 필요한 도구를 갖추었다. 이 기사의 이전 부분에서 자세히 다룬 기술에 익숙하면, 따라할 수 있는 링크만이 아니라 웹 페이지에서부터 어느 정보나 읽을 수 있다. 대신에 API 또는 다른 데이터 소스가 존재하기 때문에 이 태스크를 수행하지 않아도 되길 바란다.

XML API와 데이터 사용하기

이제 독자는 인터넷에서 다수의 XML 데이터 API에 액세스하여 사용하는 기본 기술을 보유한다. 이는 종종 REST 기반이므로 데이터를 검색하고 선행 기술을 사용하여 이를 구문 분석하기 위해 간단한 HTTP 액세스만 요구한다.

모든 API는 결국 다르다. 하나 하나 액세스하는 방법을 다룰 수는 없으므로 XML API의 일부 기본적인 예제를 살펴보자. 데이터의 가장 일반적인 소스 중 하나이며 이미 XML 형식인 것은 RSS 피드이다. RSS는 Really Simple Syndication의 약어이며 블로그 게시물, 뉴스 헤드라인 또는 팟캐스트와 같이 자주 업데이트되는 데이터를 공유하기에 가장 표준화된 형식이다. RSS 형식에 대해 자세히 학습하려면 참고자료를 참조한다. RSS가 각각 데이터 지점의 한 무리를 제공하는 <item> 태그를 개수에 상관없이 보유할 수 있는 <channel>이라는 상위 태그로 된 XML 파일이라는 점을 참고한다.

예제로서 SimpleXML을 사용하여 New York Times의 헤드라인의 RSS 피드에서 읽고(RSS 피드로 링크는 참고자료 참조) 해당하는 이야기로 링크가 있는 헤드라인 목록을 형식화한다(목록 12 참조).


목록 12. New York Times RSS 피드 읽기

<ul>
<?php
$xml = simplexml_load_file('http://www.washingtonpost.com/rss/homepage');
foreach ($xml->channel->item as $item) {
    echo "<li><a href=\"{$item->link}\">{$item->title}
</a></li>";
}
?>
</ul>

그림 1은 New York Times 피드에서 나온 출력을 보여준다.


New York Times 피드에서 나온 출력
13개의 헤드라인 목록이 있는 New York Times 피드에서 나온 출력의 화면 캡처

이제 더 완전한 사양을 갖춘 REST 기반 API의 예제를 탐색하자. 시작할 좋은 예제는 Flickr API이다. 왜냐하면 이는 데이터로 인증할 필요 없이 데이터를 많이 제공하기 때문이다. 많은 API는 Oauth 또는 다른 메커니즘을 사용하여 웹 사용자 대신에 작동하기 위해 인증하도록 요구한다. 이 단계는 일부분에 그치는 것이 아니라 전체 API에 적용될 수 있다. 이를 수행하는 방법은 각 API의 문서를 확인한다.

인증되지 않은 요청에 대해 Flickr API의 사용을 시연하려면 검색 API를 사용할 수 있다. 예를 들어, 석궁(crossbow)의 모든 공용 사진에 대해 Flickr를 검색한다. 많은 API로 할 수 있는 것처럼 인증할 필요가 없는 반면, 데이터에 액세스할 때 사용하기 위해 API 키를 생성해야 한다. Flickr의 API 문서 자체로부터 직접 이 태스크를 수행하는 것을 배워보자. API 키를 보유한 후에 목록 13과 같이 검색 기능을 사용하여 탐색할 수 있다.


목록 13. Flickr API를 사용하여 "석궁(crossbow)" 검색하기

<?php
// Store some basic information that you need to reference
$apiurl = 'http://api.flickr.com/services/rest/?';
$key = '9f275087e222ee395c92662437bf84a2'; // Replace with your own key

// Build an array of parameters that you want to request:
$params = array(
    'method' => 'flickr.photos.search',
    'api_key' => $key,
    'text' => 'crossbow', // Our search term
    'media' => 'photos',
    'per_page' => 20 // We only want 20 results
);

// Now make the request to Flickr:
$xml = simplexml_load_file($apiurl . http_build_query($params));

// From this, iterate over the list of photos & request more info:
foreach ($xml->photos->photo as $photo) {
    // Build a new request with this photo's ID
    $params = array(
        'method' => 'flickr.photos.getInfo',
        'api_key' => $key,
        'photo_id' => (string)$photo['id']
    );
    $info = simplexml_load_file($apiurl . http_build_query($params));
    
    // Now $info holds a vast amount of data about the image including
    //  owner, GPS, dates, description, tags, etc ... all to be used.

    // Let's also request "sizes" to get all of the image URLs:
    $params = array(
        'method' => 'flickr.photos.getSizes',
        'api_key' => $key,
        'photo_id' => (string)$photo['id']
    );
    $sizes = simplexml_load_file($apiurl . http_build_query($params));
    $small = $sizes->xpath("//size[@label='Small']");
    
    // For now, just going to create a simple display of the image,
    //  linked back to Flickr, with title, GPS info, and more shown:
    echo <<<EOHTML
<div>
  <a href="{$info->photo->urls->url[0]}">
    <img src="{$small[0]['source']}"
         width="{$small[0]['width']}" 
         height="{$small[0]['height']}" />
  </a>
  <ul>
    <li>Title: {$info->photo->title}</li>
    <li>User: {$info->photo->owner['realname']}</li>
    <li>Date Taken: {$info->photo->dates['taken']}</li>
    <li>Location: {$info->photo->location->locality}, 
        {$info->photo->location->county},
        {$info->photo->location->region}, 
        {$info->photo->location->country}
    </li>
  </ul>
</div>
EOHTML;
}
?>

그림 2는 Flickr 프로그램의 출력을 보여준다. 석궁(crossbows)의 검색 결과는 사진에 덧붙여 각 사진에 대한 정보(제목, 사용자, 위치, 사진을 찍은 날짜)를 포함한다.


그림 2. 목록 13에서 나온 Flickr 프로그램의 예제 출력
목록 13에서 나온 Flickr 프로그램의 예제 출력의 화면 캡처

이와 같이 API가 얼마나 강력하고 필요한 데이터를 얻기 위해 동일한 API에서 다양한 호출을 어떻게 결합할 수 있는지 확인할 수 있다. 이러한 기본적인 기술을 통해 어느 웹 사이트의 데이터나 정보 소스를 마이닝할 수 있다.

API 또는 웹 스크래핑을 통해 데이터로 어떻게 프로그램의 액세스를 확보할 수 있는지 간단히 알아보자. 그 다음에 모든 대상 데이터에 대해 액세스하고 반복하기 위해 표시된 메소드를 사용한다.


추출된 데이터에서 저장하고 보고하기

마지막으로 데이터에서 저장과 보고는 다양한 방법 중 가장 간단하다 —그리고 아마 가장 재미있을 것이다. 여기에서는 독자 자체적인 상황에 맞게 이러한 부분을 처리하는 방법을 결정하므로 제한이 없다.

일반적으로 데이터베이스에서 수집하고 저장하는 정보를 모두 취한다. 그 다음에 나중에 액세스하기 위해 계획하는 방법에 일치하는 방식으로 데이터를 구성한다. 이를 수행할 때 필요하다고 생각하는 것보다 정보를 더 많이 저장하는 것에 대해 주저해서는 안 된다. 데이터는 항상 삭제할 수 있는 반면, 추가 정보를 검색하는 것은 한 번 이러한 정보를 많이 보유하면 골치 아픈 과정이 될 수 있다. 처음부터 과대 평가하는 것이 더 낫다. 무엇보다도 어느 부분의 데이터가 흥미롭게 될 것이라는 점을 절대 알지 못한다.

그러면 그 시점에 데이터가 데이터베이스 또는 유사한 데이터 저장소에 저장된 후 보고서를 작성할 수 있다. 보고는 데이터의 일부가 존재하는 횟수를 확인하기 위해 데이터베이스에 대해 일부 기본 SQL 쿼리를 실행하는 것만큼 간단할 수 있거나, 어떤 사람이 몰두하여 자체적인 상관 관계를 찾을 수 있도록 설계된 매우 복잡한 웹 사용자 인터페이스일 수 있다.

모든 데이터를 카탈로그화하는 어려운 작업을 수행한 후에 이를 표현하기 위해 창의적인 방법을 상상할 수 있다.


결론

이 기사의 과정을 통해 XML 문서의 기본 구조와 SimpleXML을 사용하여 PHP에서 이를 구문 분석하는 간편한 메소드를 살펴 보았다. 또한 유사한 방식으로 HTML을 처리하는 기능을 추가했으며 XML 형식으로 사용할 수 없는 데이터를 스크랩하기 위해 웹 사이트 둘러보기(walking)의 기본도 다루었다. 이러한 도구를 사용하고 주어진 일부 예제를 따라서 독자는 이제 훌륭한 기본 지식 레벨을 갖추었으므로 웹 사이트를 데이터 마이닝하는 작업을 시작할 수 있다. 한 가지 기사가 전달할 수 있는 것보다 학습할 내용이 훨씬 더 많다. 데이터 마이닝에 대한 지식을 늘리는 추가적인 방법을 보려면 참고자료를 확인하도록 계획하자.



다운로드 하십시오

설명이름크기다운로드 방식
source codedatamining_source.zip10KBHTTP

다운로드 방식에 대한 정보


참고자료

교육

  • 위키피디아에 설명된 XML: XML 스펙의 설명을 읽어보자.

  • Extensible Markup Language(XML) 1.0 (Fifth Edition)(W3C Recommendation, 2008년 11월): XML 기능에 대한 구체적인 세부사항을 보려면 이 소스를 방문하자.

  • Introduction to XML(Doug Tidwell 저, developerWorks, 2002년 8월): XML이 무엇이고 왜 개발되었으며 어떻게 전자적 무역의 면모를 갖추었는지를 살펴보자. 다채로운 중요한 XML 프로그래밍 인터페이스와 표준 그리고 회사에서 XML로 비즈니스 문제를 해결하는 방법을 보여주는 두 가지 사례 연구를 검토하자.

  • XML Tutorial(W3Schools): XML과 XML이 데이터를 전송하고 저장하는 방법에 대한 강의를 읽어보자.

  • SimpleXML documentation: 정상 PHP 특성 선택기 및 배열 반복기로 처리할 수 있는 XML을 오브젝트로 변환하기 위한 도구 세트에 대해 찾아보고 배워보자.

  • php|architect's Guide to Web Scraping with PHP(Matthew Turland): 다양한 기술 및 프레임워크로 웹 스크래핑에 대한 자세한 정보를 확인하자.

  • XML Path Language(XPath) Version 1.0(W3C Recommendation, 1999년 11월): XSLT와 XPointer 사이에 공유된 기능성을 위해 일반 구문과 시맨틱을 위한 스펙에 익숙해지자.

  • Get started with XPath(Bertrand Portier, developerWorks, 2004년 5월): XPath(XML Path Language)의 기본을 다루고 있다.

  • XPath Tutorial(W3Schools): XPath와 XML 문서에서 요소와 속성을 통해 탐색하는 방법에 대한 강의를 읽어보자.

  • RSS specification: RSS 웹 컨텐츠 신디케이션 형식의 세부사항을 알아보자.

  • Flickr Services: 온라인 사진 관리 및 공유 애플리케이션인 Flickr API에 대해 살펴보자.

  • How to use regular expressions in PHP(Nathan A. Good 저, developerWorks, 2006년 1월): 사용자 입력을 유효성 검증하고 사용자 입력 및 파일 컨텐츠를 구문 분석하고 문자열을 재형식화하는 것을 배워보자.

  • PHP.net: PHP 개발자들이 주로 이용하는 웹 사이트를 방문하여 탐색하자.

  • Recommended PHP reading list(Daniel Krook 및 Carlos Hoyos 공저, developerWorks, 2006년 3월): IBM 웹 애플리케이션 개발자들이 프로그래머와 관리자를 위해 컴파일한 이러한 읽기 목록으로 PHP(Hypertext Preprocessor)에 대해 배워보자.

  • PHP and more: developerWorks에서 PHP 컨텐츠를 모두 찾아보자.

  • Zend Core for IBM: PHP로 데이터베이스를 사용 중인가? IBM DB2 V9을 지원하는 원활하고 탁월하며 설치가 간편한 PHP 개발 및 프로덕션 환경을 확인해보자.

  • RSS feed of the headlines of The New York Times: New York Times에서 나온 헤드라인의 RSS 피드를 경험해보자.

  • XML 입문 XML을 배우는 데 필요한 참고자료를 얻자.

  • developerWorks의 XML 영역: XML 분야의 기술을 향상시키는 데 도움이 되는 참고자료를 얻을 수 있다. XML 기술 자료에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다.

  • IBM developerWorks의 PHP project resources를 활용하여 PHP 기술을 향상시키자.

  • IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.

  • developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.

  • Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.

  • developerWorks podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.

  • developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.

제품 및 기술

토론

필자소개

Eli White

Eli White는 현재 MojoLive의 CTO이고, 16년 이상 동안 웹 애플리케이션 제작에 대한 일을 해왔으며 지난 10년간은 PHP 프로젝트만 독점으로 작업했다. 그는 Zend, TripAdvisor, Digg 및 Hubble SpaceTelescope Program 등에서 직무를 포함하여 과거에 다양한 많은 일들을 해왔다. 그는 "PHP 5 in Practice"의 저자이자 강연의 정기적인 연사로 참여한다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML, 오픈 소스
ArticleID=767200
ArticleTitle=PHP로 실질적인 데이터 마이닝과 구문 분석 탐색하기
publish-date=10252011

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.