홈으로 | 무료회원가입 | 아이디/비번찾기
추천음악방송
웹페이지의 필요한 내용만 가져오는 클래스 (게시판 긁어오기)
9년 전
<?php

class GalKuRi {
// public
var $response_header = ''; // 응답헤더 저장
var $contents = ''; // 페이지 전체 내용 저장
var $parse_value = array(); // 결과가 저장될 배열
// private
var $_goods_no = 0; // 결과배열에 저장할때 쓰일 상품 번호
var $_offset = 0; // 검색 시작 번지
var $_page_no = 0; // 페이지 별로 읽을 경우 페이지 번호 저장변수
var $_page_var = ''; // 페이지 별로 읽을 경우 페이지 변수명을 저장하는 변수
var $_parse_pattern = array(); // 읽어들일 문자 패턴 2차원배열
var $_process_func = ''; // 페이지 별로 처리할때 결과를 처리할 외부함수
var $_roop = 1; // 페이지를 계속 파싱할지 여부
var $_set_cookies = ''; // 쿠키 저장
var $_set_referer = ''; // 레퍼러 저장
var $_skip_offset = array(); // 건너뛸 문장
var $_wait = 0; // 한페이지 처리후 멈춤시간(단위 초)
function voidSetPattern($field,$token_start,$token_end,$del_str='') {
/********************************************************************
* public
* 파싱할 패턴문자 설정
* ex) $buf->voidSetPattern(필드명,시작문자,끝문자,[지울문자]);
*
* 텍스트 내용중 < 와 > 사이에 있는 문자열을 name 이라는 이름으로 빼내고
* 결과문자열중 를 지우고자 하는경우
* ex) $buf->voidSetPattern('name','<','>','');
********************************************************************/
if($field == '_default_')
$this->voidError('_default_ 는 사용할수 없는 단어입니다.' );
$this->_parse_pattern[$field] = array($token_start,$token_end,$del_str);
}
function voidSetSkipOffset($field,$token) {
/********************************************************************
* public
* 파싱후 패턴과 동일한 문자가 중간에 존재하여 그부분의 뒷부분 부터 파싱을 원할경우
* ex) $buf->voidSetSkipOffset(필드명,찾을문자);
*
* name 필드 파싱후 다음 파싱 패턴과 동일한 문자가 있을경우 건너뜀
* ex) $buf->voidSetSkipOffset('name','<');
*
* 필드명을 _default_ 라고 설정할경우 파싱전 해당 문자로 이동을 한후에
* 파싱을 시작함. default 시작위치를 설정
* ex) $buf->voidSetSkipOffset('_default_','<');
********************************************************************/
$this->_skip_offset[$field] = $token;
}
function voidSetCookie($var,$value) {
/********************************************************************
* public
* 쿠키를 설정합니다.
* ex) $buf->voidSetCookie(쿠키명,쿠키값);
********************************************************************/
$this->_set_cookies .= $var.'='.urlencode($value).';';
}
function voidSetReferer($ref) {
/********************************************************************
* public
* 레퍼러를 설정합니다.
* ex) $buf->voidSetReferer(레퍼러);
********************************************************************/
$this->_set_referer = $ref;
}
function voidSetPage($var,$func='',$page=1) {
/********************************************************************
* public
* 페이지 처리를 원할경우 설정
* ex) $buf->voidSetPage(페이지변수명,[외부처리함수],[시작페이지]);
* 하나의 주소에 연속된 페이지가 존재할경우 계속 읽어들일수 있습니다.
*
* 페이지변수 pagenum=1,2,3,4,5 식으로 페이지가 존재하는 경우
* ex) $buf->voidSetPage('pagenum','func',1);
*
* 주의) 페이지가 많을경우 배열에 결과값이 계속 쌓이므로 리소스가 커질수 있으니
* 생성자에 설정할수 있는 외부 함수를 이용하여 페이지 마다 바로 처리하시기 바라며
* 역시나 시간이 오래 걸릴수 있으니 쉘모드에서 실행하시기 바랍니다.
********************************************************************/
$this->_page_var = $var;
$this->_page_no = $page;
$this->_process_func = $func;
}
function voidSetSleep($sec) {
/********************************************************************
* public
* 페이지 처리시 완료후 잠시 멈춰있을 시간입니다.
* ex) $buf->voidSetSleep(초);
********************************************************************/
$this->_wait = $sec;
}
function voidGetAllContents($url,$method = 'get',$port = '80') {
/********************************************************************
* public
* 전체 페이지 내용을 긁어오는 부분입니다.
* ex) $buf->voidGetAllContents(주소,[메소드],[포트]);
*
* 결과 값은
* $buf->response_header; 응답헤더만 별도 저장
* $buf->contents; 전체페이지 내용저장
********************************************************************/
if($method != 'get' && $method != 'post')
$this->voidError('method 값이 다릅니다. '.$method);
$url_info = parse_url($url);
$fp = fsockopen($url_info['host'], $port, $errno, $errstr);
if(!$fp) {
$this->voidError($errstr.' ('.$errno.')');
}

if($method == 'post') {
fputs($fp,"POST ".$url_info['path']." HTTP/1.0rn");
fputs($fp,"Host: ".$url_info['host']."rn");
fputs($fp,"User-Agent: PHP Scriptrn");
if($this->_set_referer)
fputs($fp,"Referer: ".$this->_set_referer."rn");
if($this->_set_cookies)
fputs($fp,"Cookie: ".$this->_set_cookies."rn");
fputs($fp,"Content-Type: application/x-www-form-urlencodedrn");
fputs($fp,"Content-Length: ".strlen($url_info['query'])."rn");
fputs($fp,"Connection: closernrn");
fputs($fp,$url_info['query']);
}
else {
fputs($fp,"GET ".$url_info['path'].($url_info['query'] ? '?'.$url_info['query'] : '')." HTTP/1.0rn");
fputs($fp,"Host: ".$url_info['host']."rn");
fputs($fp,"User-Agent: PHP Scriptrn");
if($this->_set_referer)
fputs($fp,"Referer: ".$this->_set_referer."rn");
if($this->_set_cookies)
fputs($fp,"Cookie: ".$this->_set_cookies."rn");
fputs($fp,"Connection: closernrn");
}
$this->contents = '';
$this->response_header = '';
while(trim($buf = fgets($fp,1024)) != "") { //응답헤더를 읽어옵니다.
$this->response_header .= $buf;
}
while(!feof($fp)) { //내용을 읽어옵니다.
$this->contents .= fgets($fp,1024);
}
fclose($fp);
}
function voidParsePage($url,$method = 'get',$port = '80') {
/********************************************************************
* public
* 파싱하는 부분 main 이 되겠습니다.
* 페이징 처리와 계속 파싱할것인지 결정을 하고
* 외부함수 처리 역시 여기서 합니다.
* ex) $buf->voidParsePage(주소,[메소드],[포트]);
*
* _default_ 오프셋이 있으면 그쪽으로 이동시키고 패턴에 등록된 것만큼 반복을 합니다.
* name,img,price 패턴이 등록되 있다면
* name파싱,img파싱,price파싱을 계속 반복합니다.
* 더이상 내용이 없다면 종료시키거나 페이지설정이 되있다면
* 다음페이지를 읽어들여서 다시 파싱을 반복하고 페이지가 없을때까지 반복 파싱.
********************************************************************/
$this->_roop = 1;
$page_now = $this->_page_no;
$page = '';
$key = array_keys($this->_parse_pattern);
$cnt=count($key);
while($this->_roop) {
$this->_goods_no = 0;
$this->_offset = 0;
$parse_count = 0;
$this->voidGetAllContents($url.$page,$method,$port);

if($this->_skip_offset['_default_'])
$this->voidGetOffset($this->_skip_offset['_default_']);
if($this->_roop) {
while($this->_roop) {
for($i=0;$i<$cnt;$i++) {
$this->voidGetText($key[$i]);
if(!$this->_roop) {
if($cnt != count($this->parse_value[$this->_goods_no]))
unset($this->parse_value[$this->_goods_no]);
break;
}
$parse_count++;
}
$this->_goods_no++;
}
}
if($this->_page_var) {
if($parse_count >= $cnt) {
$page = '&'.$this->_page_var.'='.(++$page_now);
$this->_roop = 1;
if($this->_wait)
sleep($this->_wait);
}
else {
$this->_roop = 0;
break;
}
}

if($this->_process_func) {
call_user_func($this->_process_func,$this->parse_value);
$this->parse_value = array();
}
}
}
function voidGetOffset($str) {
/********************************************************************
* private
* 검색위치를 건너뛰는 부분입니다.
* ex) $buf->voidGetOffset(문자);
* 해당문자가 없으면 종료합니다.
********************************************************************/
$tmp_offset = strpos($this->contents,$str,$this->_offset);
if($tmp_offset)
$this->_offset = $tmp_offset + strlen($str);
else
$this->_roop = 0;
}
function voidGetText($field) {
/********************************************************************
* private
* 패턴 사이의 문자열을 추출하는 부분입니다.
* ex) $buf->voidGetText(필드);
* 역시나 해당문자가 없으면 종료합니다.
********************************************************************/
$spos = strpos($this->contents,$this->_parse_pattern[$field][0],$this->_offset);
if(!$spos) {
$this->_roop = 0;
return;
}
$spos += strlen($this->_parse_pattern[$field][0]);
$epos = strpos($this->contents,$this->_parse_pattern[$field][1],$spos);
if(!$epos) {
$this->_roop = 0;
return;
}
$this->_offset = $epos + strlen($this->_parse_pattern[$field][1]);
$str = substr($this->contents,$spos,$epos-$spos);
if($this->_parse_pattern[$field][2])
$this->parse_value[$this->_goods_no][$field] = str_replace("rn",'',str_replace($this->_parse_pattern[$field][2],'',trim($str)));
else
$this->parse_value[$this->_goods_no][$field] = str_replace("rn",'',trim($str));
if($this->_skip_offset[$field])
$this->voidGetOffset($this->_skip_offset[$field]);
}
function voidError($msg) {
exit($msg);
}
}
?>
다운로드에 올릴려다고 허접한 거라서 그냥 여기다 올리네요.
웹페이지에서 필요한 부분만 가져오는 프로그램을 클래스로 만들어서
조금이라도 쉽고 편하게 가져올수 있도록 만들어 봤습니다.
아 이거 만들때는 스누피가 있는걸 몰라서 걍 만든거니
스누피 쓴다니 만다니 라고 말씀하시면 상처입습니다 -ㅂ-;
간단한 사용설명은-------------------------------------------------------------------
$buf = new GalKuRi; //객체생성
$buf->voidSetCookie(쿠키명,쿠키값); //쿠키설정
$buf->voidSetReferer(레퍼러); //레퍼러설정
$buf->voidSetPage(페이지변수명,외부함수,페이지번호); //페이지 처리 설정 외부함수는 한페이지후 결과를 처리하기 위해 설정
$buf->voidSetSleep(초); //한페이지 처리수 정지시간
$buf->voidSetPattern(필드명,시작문자,끝문자,[지울문자]); //파싱할 패턴 설정 시작문자와 끝문자 사이의 문자열을 배열로 저장
$buf->voidSetSkipOffset(필드명,찾을문자); //파싱후 패턴에 넣은 문자와 동일한 문자가 있어서 방해될경우 그문자까지 오프셋을 뛰어 넘음
$buf->voidParsePage(주소,[메소드],[포트]); //파싱시작
#
# 파싱된 데이타를 처리하는 방법
#
$buf->parse_value 배열을 처리하면 됨
#
# voidSetPage('page','func',1) 에서 외부 함수를 설정했을경우
# 한페이지 처리시는 괜찬으나 페이지가 많으면 배열이 많이 늘어나니
# 페이지가 많을 경우에는 외부 함수 사용을 추천
#
function func(&$val) {
$val 결과배열 처리
}
----------------------------------------------------------------------------
#
# 참고
# 단순히 전체페이지 내용을 원할경우(voidSetPattern 불필요)
#
$buf = new GalKuRi;
$buf->voidSetCookie(쿠키명,쿠키값);
$buf->voidSetReferer(레퍼러);
$buf->voidGetAllContents(주소,[메소드],[포트]);
echo $buf->response_header; //헤더값
echo $buf->contents; //전체내용
----------------------------------------------------------------------------
간단한 예제 몇개.
스쿨 팁텍 목록 가져오기
function voidPrint(&$val) {
print_r($val);
/* 값을 불러오는 예제
for ($i=0; $i<count($val); $i++)
{
$val[$i]['title'];
$val[$i]['name'];
}
*/
}
$buf = new GalKuRi;
$buf->voidSetPage('page','voidPrint',1);
$buf->voidSetSkipOffset('_default_','<!-- 목록 -->');
$buf->voidSetPattern('num','<td id="bb_list">','<');
$buf->voidSetPattern('kind','<span class=small>','<');
$buf->voidSetPattern('view_url',"<a href='..","'");
$buf->voidSetPattern('title',"<span style=''>","<");
$buf->voidSetPattern('name','title="','"');
$buf->voidSetPattern('regtime','title="','"');
$buf->voidSetPattern('regdate','>','<');
$buf->voidSetPattern('hit','<td id="bb_list">','<');

$buf->voidParsePage('http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&page=1');

디엡숍 상품 리스트(tv였나.. ㅡㅡ;;) 가져오기
function voidPrint(&$val) {
print_r($val);
}
$buf = new GalKuRi;
$buf->voidSetPage('DTYPE=IMAGE&pageNo=','voidPrint',1);
$buf->voidSetSkipOffset('_default_','<form name="prodlist"');
$buf->voidSetCookie('ACODE','1ltjzE.wkt10');
$buf->voidSetCookie('tcateid','D42414');
$buf->voidSetCookie('pmmcBGIBLE8BRMUSEGM2B78CVG78KJ4','0');
$buf->voidSetCookie('pmmczGIBLE8BRMUSEGM2B78CVG78KJ4','1');
$buf->voidSetPattern('image_url','<img src="http://shopimage.hanmail.net/m_productimages/','"');
$buf->voidSetPattern('content_url','<a href="','"');
$buf->voidSetPattern('goods_name','>','</a>');
$buf->voidSetPattern('price','<strong class="price">','원',',');
$buf->voidParsePage('http://dnshop.daum.net/front/category/DetailCategory?CID=D42414');
옥션 상품리스트 (무슨상품이었더라... ㅡㅡ;;) 가져오기
function voidPrint(&$val) {
print_r($val);
}
$buf = new GalKuRi;
$buf->voidSetPage('page','voidPrint',1);
$buf->voidSetSkipOffset('_default_','<table class="listView" border="0" cellpadding="0" cellspacing="0" align="NotSet" style="width: 900px" >');
$buf->voidSetPattern('image',"<img src='","'",'');
$buf->voidSetPattern('content',"<a target="_top" href='","'",'');
$buf->voidSetPattern('name','class="itemName">','</a>','');
$buf->voidSetPattern('price','<div style="FONT-WEIGHT: bold; COLOR: #ff8004">','</div>',',');
$buf->voidParsePage('http://listings.auction.co.kr/category/list.aspx?category=01180000&frm=home');
네이버 검색 결과페이지 관련키워드 가져오기
$buf = new GalKuRi;
$buf->voidSetSkipOffset('_default_','<div class="SuggestWord">');
$buf->voidSetPattern('keyword',')));">','<');
$buf->voidSetSkipOffset('keyword','rsk.list1');
$buf->voidParsePage('http://search.naver.com/search.naver?where=nexearch&query='.urlencode('아디다스').'&frm=t1&sm=top_hty');
print_r($buf->parse_value);
추천추천 : 630 추천 목록
번호 제목
3,025
 윈도우10 시스템파일 손상 (초간단 오류 복구방법!!)
3,024
 PHP 파일 존재 여부 파악하기(로컬 파일 존재 및 원격지 파일 존재)
3,023
 [CSS] 박스 세로 가운데 중앙 정렬 6가지
3,022
 CSS Layout 수평 & 수직 정렬
3,021
 여러 도메인들 간 쿠키 공유하기
3,020
 태그 사이에 있는 텍스트를 추출
3,019
 [JQuery] textbox focus on off일때 숫자 콤마 보여주기
3,018
 쿠키 생성,가져오기,삭제
3,017
 사용자 함수 모음
3,016
 마우스,키보드 제한 ( 오른쪽클릭,드래그,영역선택등..)
3,015
 [HTML5] <video> - DOM으로 제어하기
3,014
 HTML5 video 태그에서 영상 좌우반전
3,013
 PHP - 특정 태그 및 문자열 추출, 제거
3,012
 [PHP] define과 defined의 차이
3,011
 우클릭 완벽차단 스크립트
3,010
 iframe 높이 100% 맞추기
3,009
 curl 함수를 이용한 HTTP REFERER 변경
3,008
 윈도우10 시스템 파일 및 Dism 검사
3,007
 텍스트 줄바꿈, 글자자르기 CSS
3,006
 jQuery Mobile에서 유용한 코드 10가지.
3,005
 [PHP] dirname()함수와 $_SERVER 관련 상수들
3,004
 [PHP] 파일 크기, 사이즈 불러오는 함수, filesize()
3,003
 [jQuery] jQuery Quick API
3,002
 [ transition ] 링크 hover 색상 변화 속도 조절
3,001
 PHP 5.3.0 에서 사라진 함수들 대체
목록
뮤직트로트 부산광역시 부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.