메인>>유머

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

2022-01-25 16:55:00 2839

웹페이지 소스를 파싱하는 클래스입니다. url과 정규식을 입력하면 파싱결과를 뱉어줍니다. curl을 사용하였기 때문에 fopen과 달리 PHP설정이 allow_url_fopen Off 가 되어 있어도 작동을 합니다. <클래스 소스> 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('/]*src=["']?([^>"']+)["']?[^>]*>/'); //소스에 존재하지 않는 패턴의 결과를 보여주기 위한것(아무것도 안나옴) $iup->addPattern('/ddd/'); //a 태그의 텍스트 내용을 추출한다 $iup->addPattern('/]*>([^<]+)<\/a>/'); //파싱결과를 돌려줌 $result = $iup->getResult(); //결과를 보기좋게 출력 echo '

';

    print_r($result);

    echo '
'; } 읽어주셔서 감사합니다.