개발팁

0 1,117 0

PHP 웹페이지 파싱 클래스 (웹페이지 긁어오기)

by 개발자
광고위치
웹페이지 소스를 파싱하는 클래스입니다.



url과 정규식을 입력하면 파싱결과를 뱉어줍니다.



curl을 사용하였기 때문에 fopen과 달리 PHP설정이 allow_url_fopen Off 가 되어 있어도 작동을 합니다.





<클래스 소스>



<?php

/**

* @file HTMLParser.php

*

* @class HTMLParser

*

* @bref 웹사이트의 소스를 파싱하여 결과를 돌려줌

*

* @date 2014.01.23

*

* @author 너구리안주(impactlife@naver.com)

*

* @section MODIFYINFO

*    - 2014.05.20 - 기존은 지정된 행과 열의 결과만 추출하게 했는데 이제 그냥 다 저장한다

*

*/



class HTMLParser{

   

    private $url;

    private $refer;

    private $patterns;

    private $buffer;

    private $http_code;

    private $cookie_file;

   

    /**

    * @bref 생성자

    **/

    public function __construct(){

        $this->patterns = array();

        $this->buffer = '';

        $this->http_code = 0;

        $this->cookie_file = 'cookie.txt';

    }



    /**

    * @bref url 세팅

    * @param string URL

    **/   

    public function setUrl($url){

        $this->url = $url;

    }

   

    /**

    * @bref 2014.01.28 추가 - REFERER 세팅 : refer없으면 내용이 안나오는 사이트가 있음

    * @param string URL

    **/

    public function setRefer($refer){

        $this->refer = $refer;

    }



    /**

    * @bref 패턴과 파싱결과의 row, col 세팅

    * @param string 패턴

    **/   

    public function addPattern($pattern){

        $this->patterns[] = $pattern;

    }

   

    /**

    * @bref 쿠키파일을 지정한다

    * @param string

    **/

    public function setCookieFile($filepath){

        $this->cookie_file = $filepath;

    }



    /**

    * @bref 지정한 url의 컨텐츠를 불러들인다

    **/   

    private function loadContent(){

       

        //$agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)';

        $agent = 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0';

        $curlsession = curl_init();

        curl_setopt ($curlsession, CURLOPT_URL,            $this->url);

        curl_setopt ($curlsession, CURLOPT_HEADER,          1);

       

        //http 응답코드가 302일때 redirect_url 로 따라감

        curl_setopt ($curlsession, CURLOPT_FOLLOWLOCATION, TRUE);

        curl_setopt ($curlsession, CURLOPT_RETURNTRANSFER,  true);

       

        curl_setopt ($curlsession, CURLOPT_POST,            0);

        curl_setopt ($curlsession, CURLOPT_USERAGENT,      $agent);

        curl_setopt ($curlsession, CURLOPT_REFERER,        $this->refer);

        curl_setopt ($curlsession, CURLOPT_TIMEOUT,        3);

        curl_setopt ($curlsession, CURLOPT_COOKIEJAR, $this->cookie_file);

        curl_setopt ($curlsession, CURLOPT_COOKIEFILE, $this->cookie_file);

       

        $this->buffer = curl_exec ($curlsession);

        $cinfo = curl_getinfo($curlsession);

       

        $this->http_code = $cinfo['http_code'];

        curl_close($curlsession);

       

        if ($this->http_code != 200) {

            $this->buffer = '';

        }

    }

   

    /**

    * @bref 결과를 리턴한다

    * @return array 모든 결과가 담긴 배열

    **/

    public function getResult(){

       

        $result = array();

       

        $this->loadContent();

       

        foreach($this->patterns as $item){

            $result[] = $this->getParseResult($item);

        }

       

        return $result;

    }

   

    /**

    * @bref 파싱

    * @param string 패턴

    * @return array 하나의 정규식에 대한 파싱 결과가 담긴 배열

    **/

    private function getParseResult($pattern){

        $result = array();

        preg_match_all($pattern, $this->buffer, $matches);

       

        //첫번째 요소는 날린다

        if(count($matches) > 0)    array_splice($matches, 0, 1);

       

        return $matches;

    }

}



<사용 예제>



//daum.net 의 이미지src와 a태그의 글자를 뽑아와 봅시다



$url = 'http://www.daum.net';



if($url != ''){

    $iup = new HTMLParser();

    $iup->setUrl($url);

   

    //refer가 필요할 경우

    //$iup->setRefer('http://www.daum.net');

   

    //cookie 파일을 지정한다(변경이 필요한 경우)

    //$iup->setCookieFile('cookie.txt');



    //이미지태그의 src를 추출한다

    $iup->addPattern('/<img[^>]*src=["']?([^>"']+)["']?[^>]*>/');

   

    //소스에 존재하지 않는 패턴의 결과를 보여주기 위한것(아무것도 안나옴)

    $iup->addPattern('/ddd/');

   

    //a 태그의 텍스트 내용을 추출한다

    $iup->addPattern('/<a\s[^>]*>([^<]+)<\/a>/');

   

    //파싱결과를 돌려줌

    $result = $iup->getResult();

   

    //결과를 보기좋게 출력

    echo '<pre style="text-align:left">';

    print_r($result);

    echo '</pre>';

}



읽어주셔서 감사합니다.


광고위치

등록자 인끼 내용

PHP 웹페이지 파싱 클래스 (웹페이지 긁… omg 웹페이지 소스를 파싱하는 클래스입니다. url과 정규식을 입력하면 파싱결과를 뱉어줍니다. curl을 사용하였기 때문에 fopen과 달리 PHP설정이 all…
PHP EXCEL 엑셀 업로드 방법 omg <pre> &lt;?php include_once('./_common.php'); include_once(G5_PATH.'/head.sub.php'); incl…
CSS + Jquery 아코디언 메뉴.. … omg 아코디언메뉴를 만들어달라고 해서 간단하게 생각하고 OK했는데.. 인터넷상에 제대로 된 샘플이 많이 없더라구요 한 여덟가지 테스트하다가 그나마 하나 건져서 …

Comments (0)

인기내용

PHP 웹페이지 파싱 클래스 (웹페이지 긁… omg 웹페이지 소스를 파싱하는 클래스입니다. url과 정규식을 입력하면 파싱결과를 뱉어줍니다. curl을 사용하였기 때문에 fopen과 달리 PHP설정이 all…
PHP EXCEL 엑셀 업로드 방법 omg <pre> &lt;?php include_once('./_common.php'); include_once(G5_PATH.'/head.sub.php'); incl…
광고위치

사진작품

Log in
Register