정규식을 사용하지 않는 그누보드 파서입니다. > 그누보드5 플러그인

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!

그누보드5 플러그인

그누보드는 다양한 기능을 추가하기 쉽습니다.

정규식을 사용하지 않는 그누보드 파서입니다. 정보

정규식을 사용하지 않는 그누보드 파서입니다.

첨부파일

gnuboard_scrap.zip (17.9K) 170회 다운로드 2018-01-05 22:15:29 포인트 차감800

본문

 

기존에 팁게시판에 올린 소스를 활용하여, 완전한 소스형태를 개발하였습니다.

 

상업용으로 사용가능한 소스는 따로 컨텐츠몰에 업로드할 예정입니다.

 

https://sir.kr/g5_tip/6977 게시판 파싱후 글등록 처리 함수

https://sir.kr/g5_tip/6999 PHP를 이용한 심플한 게시판 파싱 방법(Guzzle + domcralwer)

 

1. 사전 내용
 - 이 소스는 PHP 5.5 또는 그 이상에서 정상동작합니다.
 - 5.4 이하 버전에서는 composer 실행시 라이브러리 설치가 정상적으로 되지 않습니다.

 

2. 디렉토리 구성 및 파일
 - /lib/GnuboardScrap.php 그누보드 파싱을 위한 메인 파일  
 - /extend/board_scrap_functions.php 파싱처리 및 게시물 등록 함수모음
 - /scrap_test.php  : 파싱(스크래핑) 테스트용 php 파일
 - /README.txt

 

3. 설정방법
 - composer 를 이용하여 goutte를 설치하셔야 합니다.
 - composer 설치와 이용에 관한 정보는 인터넷을 참고바랍니다.
   composer.json 내용은 아래와 같습니다.
{
  "require": {
    "php": ">=5.6.0",
    "guzzlehttp/guzzle": "~6.0",
    "symfony/dom-crawler": "3.4.*",
    "symfony/css-selector": "3.4.*",
    "fabpot/goutte" : "^3.1"
  }
}

 

4. 사용방법
  - 압축을 푼 다음 디렉토리 구조에 맞게 업로드 합니다.  
  - 첨부된 scrap_test.php 를 작성하여 실행해 봅니다.
    그누보드 유머게시판이 잘 파싱되는지 확인합니다. 
  - 대상사이트 구조에 맞춰서 GnuboardScrap.php 파일 내 dom selector 를 변경합니다. 

 

5. 라이센스
  - 자세한 라이센스는 소스파일내 라이센스 구문을 참조바랍니다.  
  
6. 그외
본 프로그램을 이용함에 있어 발생한 저작권 및 법적 문제는 본 개발자와 상관 없으며, 본 프로그램을 사용한 업체 또는 사용자에게 있습니다. 이 프로그램을 다운받아 사용한 경우 이 내용에 동의한것으로 간주합니다.

 

예제코드


$url = "https://sir.kr/cm_humor/p1"; //파싱 대상 url, 유머게시판 1페이지
$target_bo_table = "free";//파싱후 등록할 대상 게시판
$result_list = gnuboard_scrap($url, $target_bo_table);
echo "<h3>파싱후 등록된 게시물</h3></br>";
for($i =0; $i < count($i); $i++) {
    $row = $result_list[$i];
    echo "<a href='/bbs/board.php?bo_table={$target_bo_table}&wr_id={$row['wr_id']}' target='_blank'>{$row['wr_id']} {$row['wr_subject']}</a><br>";
}
 

 


 /**
     * 대상 url 게시물을 파싱후 게시판에 등록한다.
     * @param $url 파싱 대상 url
     * @param $target_bo_table 파싱후 등록할 대상 테이블
     * @return array  게시물들이 등록되면, 등록한 wr_id
     */
    function gnuboard_scrap($url, $target_bo_table, $print_debug = false) {
        global $g5, $member;
        include_once dirname(__DIR__)."/lib/GnuboardScrap.php";
        $ym = date('ym', G5_SERVER_TIME);
        $upload_temp_dir = G5_DATA_PATH."/scrap"; //임시 업로드 디렉토리
        @mkdir($upload_temp_dir, G5_DIR_PERMISSION);
        @chmod($upload_temp_dir, G5_DIR_PERMISSION);
        $upload_editor_dir = G5_DATA_PATH."/editor/".$ym; //에디터 업로드 디렉토리
        @mkdir($upload_editor_dir, G5_DIR_PERMISSION);
        @chmod($upload_editor_dir, G5_DIR_PERMISSION);
        $url_info = parse_url($url);
        $domain = $url_info['host'];
        $scheme = $url_info['scheme'];
        $uri = $url_info['path'].($url_info['query'] ? "?".$url_info['query'] : "");

        $result = array();
        $scrap = new GnuboardScrap($domain, $scheme);
        if($print_debug) {
            $scrap->setDebug(true);
        }
        $list = $scrap->getList($uri);
        foreach($list as $row) {
            //todo 이미 파싱한 게시물인지 체크, $row['wr_id'] 값을 게시물에 저장후 중복된 데이타인지 체크
            $contents = $scrap->getContent($row['wr_id'], $row['content_url']);
            $upload_data_list = array();
            //todo 가변파일로 업로드된 이미지와, 에디터 embed 이미지는 분리하여 처리하여야 하나
            //      불필요하게 코드를 복잡하게 만들기 때문에, 에디터 embed 이미지로 처리한다.
            for($i = 0;$i<count($contents['content_images']); $i++) {
                $download_url = $contents['content_images'][$i];
                $url_info  = parse_url($download_url);
                $path_info = pathinfo($url_info['path']);
                $filename = $path_info['basename'];
                $filename = generate_new_filename($filename); //원본 이미지 url 경로와 다른 파일명으로 저장한다.
                $upload_filepath = $scrap->downloadUrlImage($download_url, $upload_editor_dir, $filename);
                //다운로드 url 경로와 다운로드 받은 파일경로를 같이 저장한다.
                $upload_data_list[] = array(
                      "original_url" => $download_url
                    , "upload_filepath" => "/".G5_DATA_DIR."/editor/".$ym."/".$filename
                );
            }
            //게시판 본문 이미지 태그의 정보를 다운로드한 이미지 경로로 변경한다.
            $contents['wr_content'] = board_content_image_replace($contents['wr_content'], $upload_data_list);
            $wr_id  = board_write($target_bo_table, $contents);
            $result[] = array("wr_subject" => $contents['wr_subject'], "wr_id" => $wr_id);
            //가변파일을 처리하는 경우, 임시 업로드된 이미지를 삭제한다.
            //foreach (glob($upload_temp_dir."/*") as $temp_filename) {
            //    unlink($temp_filename);
            //}

            sleep(1);
            //FIXME 예제코드가 sir.co.kr 유머게시판을 파싱합니다.
            //과도한 트래픽과 request를 방지하기 위해 게시물 1개만 파싱되도록 하였습니다.
            //페이지별로 전체를 파싱하기 위해선 아래 break 문을 삭제하시면 됩니다.
            //과도한 request가 발생하면 sir.co.kr 사이트에서 접속이 차단될수 있습니다.(주의바람)
            //sir.co.kr 에 대한 파싱은 테스트로만 사용하길 바랍니다.
            break;
        }
        if($print_debug) {
            print_r2($scrap->getDebugInfo());
        }
        return $result;
    }

추천
11

댓글 전체

감사합니다. 소스를 보니 제가 많이 부끄러워집니다.
그동안 일일이 preg_match 로 짜집기 했던 부분이 한줄로 간단하게 처리되는군요.
역시 고수의 코드는 표가 나는군요. 잘 활용하겠습니다.
composer 를 통해서 자동으로 다운받는 파일입니다. composer 사용법을 익히셔야 할것 같습니다. sir 에 보시면 컴포저 사용법 올려놓은 글이 있습니다.
감사합니다. 그러나 선생님 파일을 사용하면 이미지를 엑스박스(0kb로 다운로드)로 불러오네요...
그리고 jpg같은경우에는 해당 링크에서 직접 가져오네요...
혹시 해결방안이 없을까요?
Fatal error: Uncaught Error: Class 'GuzzleHttp\Client' not found in /home/@@@/public_html/lib/GnuboardScrap.php:25 Stack trace: #0 /home/@@@/public_html/extend/board_scrap_functions.php(279): GnuboardScrap->__construct('sir.kr', 'https') #1 /home/@@@/public_html/scrap_test.php(18): gnuboard_scrap('https://sir.kr/...', 'menu5_1') #2 {main} thrown in /home/@@@/public_html/lib/GnuboardScrap.php on line 25

인터넷 검색해서 composer 와 goutte까지 설치했습니다.
그리고 scrap_test.php 실행하니 이런 에러가 나오네요..
산한개 넘었는데 또 산입니다 ㅠㅠ;
선발대 보고드려요~
sir 파싱으로 셋팅되어 있어서 sir 외에 다른 사이트는 현재 셋팅으론 불가합니다.
확인하시고 다운받으세요~
안녕하세요 명량폐인님
게시글은 파싱이 잘되는데 이미지가 0바이트로  불러와지는 현상이 있습니다.
위 스크립트 board_write($bo_table, $contents, $files = Array() ) 중 $파일에 변수를 넣지 않아서 그런게 아닌가 하는 생각이 듭니다 어느걸 넣어야 할까요?
아하... sir의 유머게시판도 차단이 되어있다고 볼 수 있는건가요?
명랑폐인님의 기본 소스로 파싱하면 0바이트로 다운로드 됩니다.
당연히 가능합니다. 요즘 많이 쓰는 방법이고,
좀더 복잡하게 만들면, 트레이딩 봇이 되는것입니다.
api로 시세를 파싱하고, 자체 조건과 필터값을 적용한뒤에 구매/매수를 보내고, 해당 메세지들을 다시 텔레그램에 보내게 됩니다.
현재 웹호스팅을 받아 홈페이지를 운영중인데,
composer는 서버호스팅을 받아 설치해야하는 부분이죠??ㅠㅠ
웹호스팅은 사용이 불가하죠..?ㅠㅠ
가능한곳도 있지만, 안되는곳이 더 많을것 같네요. 호스팅 업체에 문의해보세요. 파서 못쓰게 ㅘ는 웹호스팅도 있을것 같네요.
전체 504
그누보드5 플러그인 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT